Добавление существующей строки json с Gson
У меня есть объект String, содержащий некоторый произвольный json. Я хочу обернуть его внутри другого объекта 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\"]";
Ответы
Ответ 1
Это мое решение:
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
, если вы хотите скрыть детали десериализации/сериализации.
Ответ 2
Для тех, кто решился на эту тему, рассмотрите этот.
A a = getYourAInstanceHere();
Gson gson = new Gson();
JsonElement jsonElement = gson.toJsonTree(a);
jsonElement.getAsJsonObject().addProperty("url_to_user", url);
return gson.toJson(jsonElement);
Ответ 3
Простой, преобразуйте 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"}
Ответ 4
Сначала вам нужно выполнить десериализацию, затем добавить его в свою структуру и повторно сериализовать все. В противном случае оболочка будет содержать только завернутый JSON в полностью экранированной строке.
Предполагается, что в строке есть следующее:
{"foo": "bar"}
и хотите, чтобы он был завершен в ваш объект Wrapper
, в результате получился JSON, который выглядит следующим образом:
{
"version": 1,
"content": {"foo": "bar"}
}
Если вы не выполнили десеризацию сначала, это приведет к следующему:
{
"version": 1,
"content": "{\"foo\": \"bar\"}"
}
Ответ 5
Если вам не нужна вся структура JSON, вам не нужно использовать обертку. Вы можете десериализовать его на общий объект json, а также после этого добавить новые элементы.
JsonParser parser = new JsonParser();
JsonObject obj = parser.parse(jsonStr).getAsJsonObject();
obj.get("version"); // Version field