我在com.google.gson.JsonObject上写了一个小的流畅包装。
当我序列化我的Json时,我得到:
{"key1":"value1","key2":"value2","key3":"{\"innerKey\":\"value3\"}"}
如何摆脱多余的引号?
我的代码:
public class JsonBuilder {
private final JsonObject json = new JsonObject();
private final Map<String, JsonBuilder> children = newHashMap();
public String toJson() {
for (Map.Entry<String, JsonBuilder> 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();
答案 0 :(得分:3)
这里的问题是你在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
属性公开,因此如果您需要完整的gson功能,仍然可以使用所有gson方法。 (当然,你应该有一个吸气剂。)不幸的是,由于它是最终的,所以不能扩展JsonObject
。
答案 1 :(得分:1)
改用gson.toJsonTree()。
答案 2 :(得分:0)
你可以看看这个 https://github.com/FasterXML/jackson-jr#writing-with-composers
Jackson jr是完整的Jackson Databind组件的紧凑替代品。