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

时间:2012-01-16 06:00:04

标签: java json gson

我在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();

3 个答案:

答案 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组件的紧凑替代品。