如何在没有内容转义的情况下将对象添加到JSONObject

时间:2015-08-10 10:34:46

标签: java json jackson

我有一个可以使用Jackson序列化为JSON的对象。我想将此对象添加到JSONObject并将内容序列化

JSONObject msg = new JSONObject();
put("something", "value");
put("myThing", myThing);
mapper.writeValueAsString(msg);
String s = msg.toString();

但结果是

{"something":"value","myThing":"com.example.things"}

我试过了

put("myThing", mapper.valueToTree(myThing))
// and 
put("myThing", mapper.writeValueAsString(myThing))

但是这两个都会导致子对象被转义

{"something":"value","myThing":"{\"foo\":\"bar\"}"}

我如何得到我真正想要的东西......

{"something":"value","myThing":{"foo":"bar"}}

2 个答案:

答案 0 :(得分:2)

为myThing对象创建一个JSONObject。

像这样:

JSONObject obj = new JSONObject();
obj.put("foo", myThing.getFoo());

并将其添加到主JSONObject:

JSONObject msg = new JSONObject();
msg.put("something", "value");
msg.put("myThing", obj);

另一种方法是使用Annotations标记应该序列化的类中的字段,然后通过反射生成JSON对象。

I have some classes on Github which you can use

使用示例:

public class MyClass {
 @JSONElement(name = "foo")
 private String field1;

 MyClass(String f) {
  this.field1 = f;
 }
 [...]
}

MyClass object = new MyClass("bar");
JSONObject json = JSONMarshaller.marshall(object);

此对象的结果JSON为:

 {"foo":"bar"}

答案 1 :(得分:0)

我设法混淆了org.jsoncom.fasterxml.jackson

ObjectNode msg = mapper.createObjectNode();
msg.put("something", "value");
msg.put("myThing", mapper.valueToTree(myThing));
String s = msg.toString();

这现在给出了我期待的输出