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