简体   繁体   English

从POJO用jackson创建JSON,但结构不符合要求

[英]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 我想在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",
    }

I am using jackson for this a created a POJO 我为此使用杰克逊创建了一个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? 哪个不是所需的结构,我是否需要调整POJO以便产生正确的结构? Thanks 谢谢

First of all your requirement is not a valid JSON structure. 首先,您的要求不是有效的JSON结构。 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: 如果这是您的要求,请将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;
    }

}

ie add @JsonIgnore on fieldName as you don't want it inside you structure. 即在您不希望在结构内部添加@JsonIgnore到fieldName上。

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. 您可以尝试将IpadField对象添加到映射中,然后对其进行序列化。 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. 同样不要忘记将@JsonIgnore添加到fieldName属性。

This should produce the desired json. 这将产生所需的json。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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