有没有办法制作一个“通用” json对象?

Pha*_*ate 6 java jackson

目前我正在做这样的事情:

public class MyObject{
   public String name;
   //constructor here
}
Run Code Online (Sandbox Code Playgroud)

所以,如果我序列化它:

ObjectMapper mapper = new ObjectMapper();
MyObject o = new MyObject("peter");
mapper.writeValue(System.out,o);
Run Code Online (Sandbox Code Playgroud)

我懂了

{"name":"peter"}
Run Code Online (Sandbox Code Playgroud)

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

public class MyObject{
  public String name;
  public String value;
  //constructor here
}
Run Code Online (Sandbox Code Playgroud)

这样调用:

 ObjectMapper mapper = new ObjectMapper();
 MyObject o = new MyObject("apple","peter");
 mapper.writeValue(System.out,o);
Run Code Online (Sandbox Code Playgroud)

会导致

{"apple":"peter"}
Run Code Online (Sandbox Code Playgroud)

可能吗?

Jas*_*n C 5

您似乎在寻求一种存储通用命名的属性及其值,然后将其呈现为JSON的方法。A 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);
Run Code Online (Sandbox Code Playgroud)

输出:

{"apple":"peter","orange":"annoying","quantity":3}      
Run Code Online (Sandbox Code Playgroud)

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

另外,从概念上讲,您想问“我的对象是什么?”

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

杰克逊可以应付所有这些要求。