【问题标题】:Adding an existing json string with Gson使用 Gson 添加现有的 json 字符串
【发布时间】:2013-12-11 15:03:47
【问题描述】:

我有一个包含任意 json 的 String 对象。我想将它包装在另一个 json 对象中,如下所示:

{
   version: 1,
   content: >>arbitrary_json_string_object<<
}

我怎样才能可靠地将我的 json 字符串作为属性添加到它而无需手动构建它(即避免繁琐的字符串连接)?

class Wrapper {
   int version = 1;
}

gson.toJson(new Wrapper())
// Then what?

请注意,添加的 json 不应 被转义,而是作为有效 json 实体的包装器的一部分,如下所示:

{
   version: 1,
   content: ["the content", {name:"from the String"}, "object"]
}

给定

String arbitraryJson = "[\"the content\", {name:\"from the String\"}, \"object\"]";

【问题讨论】:

  • 您是否尝试过添加content 字符串字段?我很想看看结果。
  • 可能内容会被转义。
  • 你的问题解决了吗?

标签: java json gson


【解决方案1】:

对于那些冒险研究这个主题的人,请考虑this

A a = getYourAInstanceHere();
Gson gson = new Gson();
JsonElement jsonElement = gson.toJsonTree(a);
jsonElement.getAsJsonObject().addProperty("url_to_user", url);
return gson.toJson(jsonElement);

【讨论】:

  • 这应该是被接受的答案!此外,如果您想添加自定义对象,请创建另一个 JsonElement,如 JsonElement jsonElement2 = gson.toJsonTree(b); 并添加到现有的,使用:jsonElement.getAsJsonObject().add("other", jsonElement2);
【解决方案2】:

简单,将您的 bean 转换为 JsonObject 并添加一个属性。

Gson gson = new Gson();
JsonObject object = (JsonObject) gson.toJsonTree(new Wrapper());
object.addProperty("content", "arbitrary_json_string");
System.out.println(object);

打印

{"version":1,"content":"arbitrary_json_string"}

【讨论】:

  • 如果 "arbitrary_json_string" 是 JSON 对象,这是否有效?
  • @LutzHorn 你可以使用JsonObject#add(JsonElement)
【解决方案3】:

这是我的解决方案:

  Gson gson = new Gson();
  Object object = gson.fromJson(arbitraryJson, Object.class);

  Wrapper w = new Wrapper();
  w.content = object;

  System.out.println(gson.toJson(w));

我在哪里更改了您的 Wrapper 课程:

// setter and getters omitted
public class Wrapper {
  public int version = 1;
  public Object content;
}

如果您想隐藏反序列化/序列化的详细信息,也可以为您的Wrapper 编写自定义序列化程序。

【讨论】:

    【解决方案4】:

    您需要先对其进行反序列化,然后将其添加到您的结构中并重新序列化整个内容。否则,包装器只会将包装后的 JSON 包含在完全转义的字符串中。

    这是假设您在字符串中有以下内容:

    {"foo": "bar"}
    

    并希望它包含在您的 Wrapper 对象中,从而生成如下所示的 JSON:

    {
        "version": 1,
        "content": {"foo": "bar"}
    }
    

    如果你没有先反序列化,会导致以下结果:

    {
        "version": 1,
        "content": "{\"foo\": \"bar\"}"
    }
    

    【讨论】:

    • 不,您不必这样做。您可以使用在下面使用LinkedTreeMap 的中介JsonObject
    • @SotiriosDelimanolis:我认为这并没有达到我认为 OP 试图实现的目标。我编辑了我的答案,以使我的意图更加明显。
    【解决方案5】:

    如果您不关心整个 JSON 结构,则不需要使用包装器。您可以将其反序列化为通用 json 对象,并在此之后添加新元素。

    JsonParser parser = new JsonParser();
    JsonObject obj = parser.parse(jsonStr).getAsJsonObject();
    obj.get("version"); // Version field
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多