I want to create a JSON file with this structure in java
"FieldA" : {
Preis: "100,00 €",
Text_de: "some german",
Text_en: "engl",
Materialnummer: "32400020",
},
"FieldB" : {
Preis: "100,00 €",
Text_de: "foo",
Text_en: "bar",
Materialnummer: "32400020",
}
I am using jackson for this a created a POJO
public class IpadField {
public String fieldname;
public String Text_de;
public String Text_en;
public String Preis;
public String Materialnummer;
public IpadField(){
}
@Override
public String toString() {
return "IpadField{" +
"fieldname='" + fieldname + '\'' +
", Text_de='" + Text_de + '\'' +
", Text_en='" + Text_en + '\'' +
", Preis='" + Preis + '\'' +
", Materialnummer='" + Materialnummer + '\'' +
'}';
}
public IpadField(String fieldname, String text_de, String text_en, String preis, String materialnummer) {
this.fieldname = fieldname;
Text_de = text_de;
Text_en = text_en;
Preis = preis;
Materialnummer = materialnummer;
}
}
When creating a list of these fields with jackson
public void createJson() throws Exception {
File outFile = new File("d://test.json");
if (outFile.exists()){
outFile.delete();
}
IpadField fieldaA = new IpadField("fieldA", "test", "test", "test", "test");
IpadField fieldaB = new IpadField("fieldB", "test", "test", "test", "test");
Assert.assertFalse(outFile.exists());
JsonCreator.createForField(outFile, fieldaA );
ArrayList<IpadField> fieldList = new ArrayList<IpadField>();
fieldList.add(fieldaA);
fieldList.add(fieldaB);
JsonCreator.createForList(outFile, fieldList);
Assert.assertTrue(outFile.exists());
This produces
[
{
"Materialnummer": "test",
"Preis": "test",
"Text_de": "test",
"Text_en": "test",
"fieldname": "fieldA"
},
{
"Materialnummer": "test",
"Preis": "test",
"Text_de": "test",
"Text_en": "test",
"fieldname": "fieldB"
}
]
Which is not the desired structure, any idea how I need to adapt the POJO so that it produces the correct structure? Thanks
First of all your requirement is not a valid JSON structure. It should be something like this:
{
"FieldA": {
"Preis": "100,00 €",
"Text_de": "some german",
"Text_en": "engl",
"Materialnummer": "32400020"
},
"FieldB": {
"Preis": "100,00 €",
"Text_de": "foo",
"Text_en": "bar",
"Materialnummer": "32400020"
}
}
If this is your Requirement, change you POJO to something like this:
import com.fasterxml.jackson.annotation.JsonIgnore;
public class IpadField {
@JsonIgnore
public String fieldname;
public String Text_de;
public String Text_en;
public String Preis;
public String Materialnummer;
public IpadField() {
}
@Override
public String toString() {
return "IpadField{" + "fieldname='" + fieldname + '\'' + ", Text_de='" + Text_de + '\'' + ", Text_en='"
+ Text_en + '\'' + ", Preis='" + Preis + '\'' + ", Materialnummer='" + Materialnummer + '\'' + '}';
}
public IpadField(String fieldname, String text_de, String text_en, String preis, String materialnummer) {
this.fieldname = fieldname;
Text_de = text_de;
Text_en = text_en;
Preis = preis;
Materialnummer = materialnummer;
}
}
ie add @JsonIgnore on fieldName as you don't want it inside you structure.
Then it should go something like this:
public void createJSON(){
File outFile = new File("d://test.json");
if (outFile.exists()){
outFile.delete();
}
IpadField fieldaA = new IpadField("fieldA", "test", "test", "test", "test");
IpadField fieldaB = new IpadField("fieldB", "test", "test", "test", "test");
Map<String, IpadField> addIpadMap = addIpad(null, fieldaA);
addIpadMap = addIpad(addIpadMap, fieldaB);
ObjectMapper mapper = new ObjectMapper();
ObjectWriter writer = mapper.writer(new DefaultPrettyPrinter());
writer.writeValue(outFile, addIpadMap);
}
public Map<String, IpadField> addIpad(Map<String, IpadField> map, IpadField ipadField) {
if (map == null)
map = new HashMap<String, IpadField>();
map.put(ipadField.fieldname, ipadField);
return map;
}
It will give output something like this:
{
"fieldA" : {
"Text_de" : "test",
"Text_en" : "test",
"Preis" : "test",
"Materialnummer" : "test"
},
"fieldB" : {
"Text_de" : "test",
"Text_en" : "test",
"Preis" : "test",
"Materialnummer" : "test"
}
}
You can try adding your IpadField
objects into a map then serialize it. Something like:
IpadField fieldaA = new IpadField("fieldA", "test", "test", "test", "test");
IpadField fieldaB = new IpadField("fieldB", "test", "test", "test", "test");
Assert.assertFalse(outFile.exists());
Map<String,IpadField> fields = new HashMap<String,IpadField>();
fields.put(fieldaA.getFieldName(),fieldaA);
fields.put(fieldaB.getFieldName(),fieldaB);
ObjectMapper mapper = new ObjectMapper();
mapper.writeValueAsString(fields);
Also don't forget to add @JsonIgnore
to the fieldName property.
This should produce the desired json.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.