2016-12-05 45 views
0

我想在Java创建这种结构的JSON文件从POJO与杰克逊创建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; 
    } 

} 

当杰克逊创建这些字段列表

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,使其产生正确的结构? 谢谢

+0

你期望的结构并不似乎是有效的JSON。你确定没有围绕'{'和'}'吗? – meriton

回答

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

} 

即对字段名加@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

您可以尝试将您的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。