带有Map的Java对象的jackson序列化?

时间:2014-08-19 05:06:06

标签: java json jackson

我有一个像这样的Java类,想要使用Jackson转换为JSON。谢谢你的帮助。

  1. Java Class

    public class myClass {
       String Id;
       Map<String, Object> optionalData = new LinkedHashMap<String, Object>();
    }
    
  2. 如何使用Jackson ObjectMapper将其序列化为JSON?

  3. 例如,假设optionalData是一个地图,可以保存两个条目<"type", "book"><"year", "2014"> 我希望输出如下。请注意,optionalData的键/值可以随时更改(因此,我无法使用Map创建&#34;静态&#34; Java对象)

      [ 
        { 
          id: "book-id1",
          type: "book",
          year: "2014"
        },
        { 
          id: "book-id2",
          type: "book",
          year: "2013"
         }
      ]
    

2 个答案:

答案 0 :(得分:2)

您可以在getter方法上使用@JsonAnyGetter注释,该方法返回可选值的映射。请参阅详细解释的this blog plost

以下是一个例子:

public class JacksonAnyGetter {

    public static class myClass {
        final String Id;
        private final Map<String, Object> optionalData = new LinkedHashMap<>();

        public myClass(String id, String key1, Object value1, String key2, Object value2) {
            Id = id;
            optionalData.put(key1, value1);
            optionalData.put(key2, value2);
        }

        public String getid() {
            return Id;
        }

        @JsonAnyGetter
        public Map<String, Object> getOptionalData() {
            return optionalData;
        }
    }

    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        List<myClass> objects = Arrays.asList(
                new myClass("book-id1", "type", "book", "year", 2013),
                new myClass("book-id2", "type", "book", "year", 2014)
        );
        System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(objects));
    }

}

输出:

[ {
  "id" : "book-id1",
  "type" : "book",
  "year" : 2013
}, {
  "id" : "book-id2",
  "type" : "book",
  "year" : 2014
} ]

答案 1 :(得分:1)

您需要编写自己的Jackson JsonSerializer以根据需要从Java对象创建自定义JSON字符串。

以下是不错的帖子以及示例


使用GSON JsonSerializer

可以实现同样的目标

以下是一些例子


以下是使用GSON Serialiser

的代码
List<MyClass> list = new ArrayList<MyClass>();

MyClass myClass1 = new MyClass();
myClass1.setId("book-id1");
myClass1.getOptionalData().put("type", "book");
myClass1.getOptionalData().put("year", "2014");
list.add(myClass1);

MyClass myClass2 = new MyClass();
myClass2.setId("book-id2");
myClass2.getOptionalData().put("type", "book");
myClass2.getOptionalData().put("year", "2013");
list.add(myClass2);

class MyClassSerialiser implements JsonSerializer<MyClass> {

    @Override
    public JsonElement serialize(final MyClass obj, final Type typeOfSrc,
            final JsonSerializationContext context) {
        final JsonObject jsonObject = new JsonObject();

        jsonObject.addProperty("id", obj.getId());
        Map<String, String> optioanlData = obj.getOptionalData();
        if (optioanlData.size() > 0) {
            for (Map.Entry<String, String> entry : optioanlData.entrySet()) {
                jsonObject.addProperty(entry.getKey(), entry.getValue());
            }
        }

        return jsonObject;
    }
}

String jsonString = new GsonBuilder().setPrettyPrinting().
        .registerTypeAdapter(MyClass.class, new MyClassSerialiser()).create()
        .toJson(list);

System.out.println(jsonString);

输出:

[
    {
        "id": "book-id1",
        "type": "book",
        "year": "2014"
    },
    {
        "id": "book-id2",
        "type": "book",
        "year": "2013"
    }
]