使用来自POJO的jackson创建JSON但是不是所需的结构

时间:2016-12-05 23:16:00

标签: java json jackson

我想在java

中创建一个具有此结构的JSON文件
"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",
    }

我正在使用杰克逊为此创建了一个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;
    }

}

使用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());

这会产生

[
    {
        "Materialnummer": "test",
        "Preis": "test",
        "Text_de": "test",
        "Text_en": "test",
        "fieldname": "fieldA"
    },
    {
        "Materialnummer": "test",
        "Preis": "test",
        "Text_de": "test",
        "Text_en": "test",
        "fieldname": "fieldB"
    }
]

哪个不是理想的结构,我知道如何调整POJO以使其产生正确的结构? 感谢

2 个答案:

答案 0 :(得分:2)

首先,您的要求不是有效的JSON结构。它应该是这样的:

{
    "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"
    }
   }
  • 围绕整个数据的括号
  • 用双引号括起来的所有键
  • 最后一个值不能有逗号。

如果这是您的要求,请将POJO更改为以下内容:

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;
    }

}

即在fieldName上添加@JsonIgnore,因为你不希望它在你的结构中。

然后它应该是这样的:

    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;
    }

它会输出类似这样的输出:

{
  "fieldA" : {
    "Text_de" : "test",
    "Text_en" : "test",
    "Preis" : "test",
    "Materialnummer" : "test"
  },
  "fieldB" : {
    "Text_de" : "test",
    "Text_en" : "test",
    "Preis" : "test",
    "Materialnummer" : "test"
  }
}

答案 1 :(得分:1)

您可以尝试将IpadField个对象添加到地图中,然后对其进行序列化。类似的东西:

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);

另外,请不要忘记将@JsonIgnore添加到fieldName属性中。

这应该产生所需的json。