如何在没有太多引号的情况下序列化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组件的紧凑替代品。