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

2024-01-17

我正在 com.google.gson.JsonObject 上编写一个小型流畅的包装器。

当我序列化 Json 时,我得到:

{"key1":"value1","key2":"value2","key3":"{\"innerKey\":\"value3\"}"}

如何去掉多余的引号?

My code:

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,并且只稍微延长它。如果你想包裹一个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());
    }

}

请注意,我已经做了jsonpublic 属性,这样如果您想要完整的 gson 功能,您仍然可以使用所有 gson 方法。 (当然,你应该有一个吸气剂。)不幸的是,人们不能扩展JsonObject因为它是最终的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 2 个日期值之间的随机时间和日期

    我正在尝试编写一个 php 脚本 或代码行 来回显两个日期之间的随机时间和日期 例如 2012 12 24 13 03 这将是我选择的日期2012年10月1日和2013年1月1日之间 有什么想法如何最好地做到这一点 提前致谢 简单 只需选择
  • 如何在 Angular/TypeScript 中组合两个 URLSearchParam?

    我有两个URLSearchParams物体 我想将这两个物体结合起来制作第三个 例如 我可以有 let params1 new URLSearchParams params1 set page one params1 set size hu
  • 将 Logstash json 消息分解为字段

    它有一个日志文件 用于存储带有时间戳和 json 消息的事件 例如 时间戳 foo 12 bar 13 我想将 json 部分中的键 foo 和 bar 分解为 Logstash 输出中的字段 我知道我可以将 Logstash 文件过滤器中
  • VS Code Python 中的“启动 Jupyter 服务器”

    我已经安装了带有 Python 扩展的 VS Code 我已经使用 Anaconda 发行版创建了一些 conda 环境 当我以交互模式运行任何 python 代码时 在下面的部分中显示 正在启动 jupyter 服务器 并且代码继续运行
  • 使用一个查询从 mysql 表创建带有 rowspan 的 html 表?

    我有个问题 假设我有一个具有以下结构的关系表 ClientInvoices id id client id invoice 1 1 1 2 1 2 3 2 3 4 3 4 5 1 5 您可以看到客户 1 有 3 张发票 每个客户可以有多个发
  • 在 SQLite.cs 中找不到类型或命名空间“Sqlite”

    我有一个使用 SQLite 的 Windows Phone 8 应用程序 该应用程序具有许多数据库功能 并包括一个 sqlite 数据库文件 该文件在运行应用程序时被复制到本地文件夹并进行访问 所有这些都没有问题 直到我第一次切换到发布版本
  • 无法使用带有 python 的 selenium 通过 sendkeys 将文件上传到 iframe 内的按钮元素

    环境 Python Selenium 我正在尝试将本地文件上传到上传文件按钮 首先 我尝试查看是否可以找到该元素并单击该按钮 我通过使用成功了 driver switch to frame upload frame driver find
  • 在 C++ 中声明基于函数参数的本地数组是合法的

    我从一本书中读到 以下 C 代码不应编译 void f int n int m int a n b n m 因为数组的大小不是在编译时确定的 但我尝试了一下 发现无论是全局函数还是成员函数 使用g 都可以编译成功 这在最近的 C 实现中是合
  • 如何从Java代码生成UML图(尤其是序列图)?

    如何从现有的 Java 代码生成 UML 图 尤其是序列图 ObjectAid UML 资源管理器 http www objectaid com home 是我用过的 这很容易已安装 https www objectaid com inst
  • C# 线程池限制线程数

    好吧 我已经对该网站进行了公平的搜索 并阅读了许多有关该主题的帖子 我发现这个问题 C 中的简单线程池代码 https stackoverflow com questions 435668 code for a simple thread
  • Python - 如何使用 ioctl 或 spidev 从设备读取输入?

    我有一个提供它的供应商提供了一些 C 代码来监听按钮按下 该代码使用ioctl 该设备具有 SSD1289 控制器 按钮不需要额外的引脚 可以通过 SPI 读取其状态 这就是我想要的 读取按下了哪个按钮 我试图在 Python 中为我自己的
  • SCONS 运行目标

    我一直在寻找 寻找 但找不到我的问题的答案 我今晚刚刚开始学习 scons 看起来棒极了 不过我遇到了一点困惑 为了便于开发 我经常喜欢让我的 make 文件构建我的目标 然后运行它 以便我可以通过一次按键来测试更改 这在 make 文件中
  • Qt,没有这样的槽

    为什么我会得到这个 Object connect No such slot Ide on action Exit triggered index Object connect sender name actionClose Project
  • setTextIsSelectable 如何防止键盘出现?

    如果我使用包含单个 EditText 的单个 Activity 创建一个简单的应用程序 并且我这样做 EditText editText EditText findViewById R id editText editText setTex
  • 禁用帆中的用户挂钩

    我正在 Heroku 上托管的一个项目中使用 sails 我有一个运行 sails Web 服务器的 Web 进程和一个使用与 Web 服务器使用的模型相同的模型的工作进程 为了使其成为可能 我有不同的方式使用相同的代码启动每个进程 app
  • Python 3.3 - 连接 Oracle 数据库

    python 3 3有连接Oracle数据库的模块吗 哪个最容易使用 像 mysql 模块之类的东西只能与 Oracle 一起使用 最好是 10g 版本 但 11g 也可以 有 cx Oracle Install gt You should
  • Java 内存模型:创建最终实例字段的循环引用图(所有字段均在同一线程内分配)是否安全?

    比我更了解 Java 内存模型的人可以确认我对以下代码正确同步的理解吗 class Foo private final Bar bar Foo this bar new Bar this class Bar private final Fo
  • Powershell函数递归获取元数据

    我正在修改一些 powershell 代码 我发现这些代码可以递归地从文件中获取元数据 但我在访问文件夹中的文件夹时遇到问题 我从 share 下直接列出的文件夹中获取元数据 而不是从那里的文件夹和文件中获取元数据 如何将此代码修改为文件夹
  • 为什么 notebook() 对 IJulia 不起作用?

    我在尝试使用时收到此问题notebook 在 Julia 命令行界面 REPL 中 julia gt using IJulia Info Precompiling IJulia 7073ff75 c697 5162 941a fcdaad2
  • 如何在没有太多引号的情况下序列化 JsonObject?

    我正在 com google gson JsonObject 上编写一个小型流畅的包装器 当我序列化 Json 时 我得到 key1 value1 key2 value2 key3 innerKey value3 如何去掉多余的引号 My