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

Java 如何在没有太多引号的情况下序列化JsonObject?,java,json,gson,Java,Json,Gson,我正在com.google.gson.JsonObject上编写一个小的fluent包装 当我序列化Json时,我得到: {"key1":"value1","key2":"value2","key3":"{\"innerKey\":\"value3\"}"} 我如何去掉多余的引号 我的代码: public class JsonBuilder { private final JsonObject json = new JsonObject(); private final Map

我正在com.google.gson.JsonObject上编写一个小的fluent包装

当我序列化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();
公共类JsonBuilder{
私有最终JsonObject json=新JsonObject();
private final Map children=newHashMap();
公共字符串toJson(){
对于(Map.Entry:children.entrySet()){
String value=entry.getValue().toJson();
添加(entry.getKey(),value);
}
儿童。清除();
返回json.toString();
}
公共JsonBuilder添加(字符串键、字符串值){
addProperty(键、值);
归还这个;
}
公共JsonBuilder添加(字符串键,JsonBuilder值){
先决条件.checkArgument(!children.containsKey(key));
儿童。放置(键、值);
归还这个;
}
}
String json=new JsonBuilder()
.添加(“键1”、“值1”)
.添加(“键2”、“值2”)
.add(“key3”,新JsonBuilder()
.add(“innerKey”、“value3”))
.toJson();

这里的问题是在
JsonBuilder
类中混合了字符串和对象。而是尽可能地贴近
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方法。(当然,您可能应该有一个getter。)不幸的是,不能扩展
JsonObject
,因为它是最终的。

使用gson.toJsonTree()代替。

您可以看看这个


Jackson jr是完整Jackson数据绑定组件的紧凑替代品。

这是json语法,我认为没有办法禁用它。删除它们的具体原因是什么?下划线java库有U.objectBuilder()和U.arrayBuilder()方法。