Reputation: 197
I am using JAXB for my json conversion to java object. The problem I am facing is that it leads me to create huge number of classes which serves no purpose except acting as a place holder for json tags.
For example: Consider below json:
{
"proposalAggregation": {
"Buys": {
"Heading1": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
},
"Heading2": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
},
"Sells": {
"Heading1": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
},
"Heading2": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
},
"TAChanges": {
"Heading1": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
},
"Heading2": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
},
"Existing": {
"Heading1": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
},
"Heading2": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
},
"Proposed": {
"Heading1": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
},
"Heading2": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
},
"PIAChanges": {
"Heading1": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
},
"Heading2": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
}
}
}
Now to deserialize this JSON as-is to java object these are the java classes i need to create:
Class ProposalAggregation --> this contains Buys, sells, existing, porposed,TAChanges, PIA
Class Buys extends Calculation
Class Sells extends Calculation
Class Existing extends Calculation
Class proposed extends Calculation
Class TAChanges extends Calculation
Class PIAChanges extends Calculation
Class Calculation -- > this contains heading1 and heading2
class Heading1
Class Heading2
So in total 9 classes to mimic above JSON and if we looks at the role of these classes they are nothing but place holders for JSON tags. Is there any easy way for this ?
Upvotes: 3
Views: 21503
Reputation: 37
Use Jackson instead of JAXB. Refer the following link for more details. http://wiki.fasterxml.com/JacksonInFiveMinutes
Upvotes: 3
Reputation: 5329
You can implement Google's GSON library in following manner. Have shown with a sample class, you can modify it further.
Class - ProposalAggregation
package com.test;
import java.util.Map;
public class ProposalAggregation {
private Map<String, Map<String, String>> Buys;
private Map<String, Map<String, String>> Sells;
private Map<String, Map<String, String>> TAChanges;
public Map<String, Map<String, String>> getBuys() {
return Buys;
}
public void setBuys(Map<String, Map<String, String>> buys) {
Buys = buys;
}
public Map<String, Map<String, String>> getSells() {
return Sells;
}
public void setSells(Map<String, Map<String, String>> sells) {
Sells = sells;
}
public Map<String, Map<String, String>> getTAChanges() {
return TAChanges;
}
public void setTAChanges(Map<String, Map<String, String>> tAChanges) {
TAChanges = tAChanges;
}
public String toString() {
return "BUYS=" + this.Buys + " \nSELLS=" + this.Sells + " \nTACHANGES="
+ this.TAChanges;
}
}
Test main class
Note that I have modified key
names just to verify the conversion is correct.
package com.test;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import com.google.gson.Gson;
public class TestClass {
public static void main(String[] args) {
Gson gson = new Gson();
try {
String jsonString = " { 'Buys': { 'bHeading1': { 'bkey1': 'value1', 'bkey2': 'value2', 'bkey3': 'value3' }, 'bbHeading2': { 'bbkey1': 'value1', 'bbkey2': 'value2', 'bbkey3': 'value3' } }, "
+ "'Sells': { 'sHeading1': { 'skey1': 'value1', 'skey2': 'value2', 'skey3': 'value3' }, 'ssHeading2': { 'sskey1': 'value1', 'sskey2': 'value2', 'sskey3': 'value3' } }, "
+ "'TAChanges': { 'Heading1': { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' }, 'Heading2': { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' } }, 'Existing': { 'Heading1': { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' }, 'Heading2': { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' } }, 'Proposed': { 'Heading1': { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' }, 'Heading2': { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' } }, 'PIAChanges': { 'Heading1': { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' }, 'Heading2': { 'key1': 'value1', 'key2': 'value2', 'key3': 'value3' } } }";
// convert to java class
ProposalAggregation obj = gson.fromJson(jsonString, ProposalAggregation.class);
System.out.println("OBJECT : " + obj);
// convert to json
String jsonStringFromObj = gson.toJson(obj);
System.out.println("JSON : " + jsonStringFromObj);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Here's the output.
OBJECT : BUYS={bHeading1={bkey1=value1, bkey2=value2, bkey3=value3}, bbHeading2={bbkey1=value1, bbkey2=value2, bbkey3=value3}}
SELLS={sHeading1={skey1=value1, skey2=value2, skey3=value3}, ssHeading2={sskey1=value1, sskey2=value2, sskey3=value3}}
TACHANGES={Heading1={key1=value1, key2=value2, key3=value3}, Heading2={key1=value1, key2=value2, key3=value3}}
JSON : {"Buys":{"bHeading1":{"bkey1":"value1","bkey2":"value2","bkey3":"value3"},"bbHeading2":{"bbkey1":"value1","bbkey2":"value2","bbkey3":"value3"}},"Sells":{"sHeading1":{"skey1":"value1","skey2":"value2","skey3":"value3"},"ssHeading2":{"sskey1":"value1","sskey2":"value2","sskey3":"value3"}},"TAChanges":{"Heading1":{"key1":"value1","key2":"value2","key3":"value3"},"Heading2":{"key1":"value1","key2":"value2","key3":"value3"}}}
Upvotes: 8
Reputation: 1436
It is not clear from OP but if you do not even need classes, Jackson can deserialize JSON into HashMap of HashMaps and do the reverse as well. link to a blog doing the same
Upvotes: 1