Добавление существующей строки 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