В результате синтаксического анализа строки JSON синтаксический анализатор создает дерево JsonElements, а его возвращаемое значение является элементом, который является корнем этого дерева. Ответом на то, кто «отвечает» за заполнение набора членов, является парсер; это то, что парсер делает для разбора ввода.
Нет необходимости «связываться»; есть структура данных, которая эквивалентна JSON. Например, если ваш JSON
{ "stuff" : { "foo" : "F" , "bar" : "B" } }
тогда карта в JsonObject верхнего уровня имеет одну запись, обозначенную как «материал», и значением этой записи является JsonObject, карта которого имеет две записи, обозначенные как «foo» и «bar», значения которых JsonPrimitive значения, в данном случае строки.
Последующие операции «get» извлекают узлы из этого дерева.
Когда вы написали это:
private static JsonObject jsonObjectAddress = new JsonObject();
вы выделили новый JsonObject, который никогда не используется, потому что на следующей строке
jsonObjectAddress = ...
вы устанавливаете переменную в другой JsonObject, который существует в древовидной структуре, созданной анализатором.
Отредактировано ещё:
Возможно, я неправильно понял ваше использование терминологии родителей / детей. Я истолковал его как ссылку на отношения родитель / потомок в дереве объектов. Но, похоже, вы также ссылаетесь на отношения суперкласс / подкласс.
Я думаю, что вы смотрите на это неправильно. Не существует отдельного «экземпляра JsonObject» и «экземпляра JsonElement». Существует (по крайней мере концептуально) только один объект; объект является элементом JsonElement и (в данном конкретном случае) также является объектом JsonObject.
Так работают классы Java.
Итак, когда вы получаете узел из дерева разбора, он обрабатывается как JsonElement, потому что это базовый тип для всех возможностей. Элементом может быть JsonObject, JsonPrimitive, JsonArray или JsonNull. Когда вы вызываете «getAsJsonObject», вы в основном говорите, что теперь хотите обработать полученный элемент как объект (и внутренне GSON проверит, имеет ли это смысл).
Добавлено после обновления к вопросу.
jsonObjectAddress =
jsonParser.parse(bufferRead) // builds tree, returns
// root node as JsonElement
.getAsJsonObject() // returns that element (the root)
// now considered as JsonObject
.getAsJsonObject("address"); // looks up "address" in the members
// map of the root, finds a JsonElement,
// returns that element considered as
// a JsonObject
// and that last is what you store in jsonObjectAddress.
Каждый JsonElement является JsonPrimitive, JsonObject, JsonArray или JsonNull. Наш интерес связан с JsonObject; они по определению структурированы в дальнейшие области. Каждый JsonObject будет иметь карту с именем 'members', которая перечисляет поля объекта.
Корневой объект (представляющий строку JSON в целом) имеет поля с именами «имя», «адрес», «роль» и т. Д., И, следовательно, его карта содержит ключи «имя», «адрес», «роль» и т. д. Объект, представляющий «адрес», имеет поля с названиями «улица», «город» и т. д., и, следовательно, его карта содержит ключи «улица», «город» и т. д.