简体   繁体   中英

Creating JSON with jackson from POJO but is is not in desired structure

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"
    }
   }
  • Parenthesis around whole data
  • All keys surrounded with double quotes
  • Last value cannot have a comma.

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM