如何在没有太多引号的情况下序列化JsonObject?

我在com.google.gson.JsonObject上写了一个小的流畅包装器。

当我序列化我的Json时,我得到:

{"key1":"value1","key2":"value2","key3":"{\"innerKey\":\"value3\"}"} 

如何摆脱多余的报价?

我的代码:

 public class JsonBuilder { private final JsonObject json = new JsonObject(); private final Map children = newHashMap(); public String toJson() { for (Map.Entry entry : children.entrySet()) { String value = entry.getValue().toJson(); add(entry.getKey(), value); } children.clear(); return json.toString(); } public JsonBuilder add(String key, String value) { json.addProperty(key, value); return this; } public JsonBuilder add(String key, JsonBuilder value) { Preconditions.checkArgument(!children.containsKey(key)); children.put(key, value); return this; } } String json = new JsonBuilder() .add("key1", "value1") .add("key2", "value2") .add("key3", new JsonBuilder() .add("innerKey", "value3")) .toJson(); 

这里的问题是你在JsonBuilder类中混合了String和Object。 而是尽可能地贴近JsonObject ,并且只是稍微扩展它。 如果你想包装一个JsonBuilder ,就像这样做,尽可能修改JsonObject

 package com.craigmj.gson; import java.util.HashMap; import com.google.gson.JsonObject; class JsonBuilder { public final JsonObject json = new JsonObject(); public String toJson() { return json.toString(); } public JsonBuilder add(String key, String value) { json.addProperty(key, value); return this; } public JsonBuilder add(String key, JsonBuilder value) { json.add(key, value.json); return this; } } public class GsonTest { public static void main(String[] args) { System.out.println(new JsonBuilder() .add("key1", "value1") .add("key2", "value2") .add("key3", new JsonBuilder() .add("innerKey", "value3")) .toJson()); } } 

请注意,我已将json属性设置为public,因此如果您需要完整的gsonfunction,仍可以使用所有gson方法。 (当然,你应该有一个getter。)不幸的是,由于它是最终的,所以无法扩展JsonObject

请改用gson.toJsonTree()。

你可以看看这个https://github.com/FasterXML/jackson-jr#writing-with-composers

Jackson jr是完整的Jackson Databind组件的紧凑替代品。