有没有办法制作一个"泛型" json对象?

时间:2014-03-24 17:13:00

标签: java jackson

目前我正在做类似的事情:

public class MyObject{
   public String name;
   //constructor here
}

所以,如果我序列化它:

ObjectMapper mapper = new ObjectMapper();
MyObject o = new MyObject("peter");
mapper.writeValue(System.out,o);

我得到了

{"name":"peter"}

我想使这个通用,所以课程将是:

public class MyObject{
  public String name;
  public String value;
  //constructor here
}

这个电话:

 ObjectMapper mapper = new ObjectMapper();
 MyObject o = new MyObject("apple","peter");
 mapper.writeValue(System.out,o);

会导致

{"apple":"peter"}

有可能吗?

2 个答案:

答案 0 :(得分:3)

您似乎想要一种方法来存储通常命名的属性及其值,然后将它们呈现为JSON。 Properties是一个很好的自然表示,ObjectMapper知道如何序列化这个:

ObjectMapper mapper = new ObjectMapper();

Properties p = new Properties();
p.put("apple", "peter");
p.put("orange", "annoying");
p.put("quantity", 3);
mapper.writeValue(System.out, p);

输出:

{"apple":"peter","orange":"annoying","quantity":3}      

虽然您可以从头开始构建ObjectNode,但使用ObjectNode来存储数据可能会导致Jackson与您的内部业务逻辑的不良耦合。如果您可以使用更合适的现有对象,例如PropertiesMap的任何变体,则可以将JSON端与数据隔离。

添加到此:从概念上讲,您想问“我的对象是什么?”

  • 它是JSON对象节点吗?然后考虑ObjectNode
  • 这是属性的集合吗?然后考虑Properties
  • 是一般的a - > b不是属性的地图(例如,字符串的集合 - >频率计数)?然后考虑另一种Map

杰克逊可以处理所有这些问题。

答案 1 :(得分:1)

您可以直接使用杰克逊的API:

,而不是通过POJO
private static final JsonNodeFactory FACTORY = JsonNodeFactory.instance;

//

final ObjectNode node = FACTORY.objectNode();
node.put("apple", "peter");
// etc

您也可以嵌套所需的节点。