【问题标题】:How to serialize a JsonObject without too much quotes?如何在没有太多引号的情况下序列化 JsonObject?
【发布时间】:2012-02-11 04:09:50
【问题描述】:

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

【问题讨论】:

  • 那是json语法,我认为没有办法禁用它。删除它们的任何具体原因?
  • Underscore-java 库有 U.objectBuilder() 和 U.arrayBuilder() 方法。

标签: java json gson


【解决方案1】:

这里的问题是您在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,因为它是最终的。

【讨论】:

    【解决方案2】:

    改用 gson.toJsonTree()。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-27
        • 1970-01-01
        • 2021-12-19
        • 1970-01-01
        • 2010-10-08
        • 1970-01-01
        • 2017-02-20
        • 1970-01-01
        相关资源
        最近更新 更多