使用Gson添加现有的json字符串

时间:2013-12-11 15:03:47

标签: java json gson

我有一个包含一些任意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\"]";

5 个答案:

答案 0 :(得分:9)

对于那些关于这个主题的人,请考虑this

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

答案 1 :(得分:7)

简单,将您的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"}

答案 2 :(得分:5)

这是我的解决方案:

  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编写自定义序列化程序。

答案 3 :(得分:2)

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

假设您在字符串中包含以下内容:

{"foo": "bar"}

并希望它包装在您的Wrapper对象中,从而产生一个如下所示的JSON:

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

如果您没有先反序列化,则会产生以下结果:

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

答案 4 :(得分:1)

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

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