Как переменная экземпляра дочернего класса соприкоснулась с экземпляром родительского класса - PullRequest
0 голосов
/ 09 июня 2019

Я пытаюсь понять область действия экземпляра родительского и дочернего класса или их поведение в приведенном ниже фрагменте кода.(Пройдя через GSON Framework к функциональности недостаточного уровня)

private static JsonObject jsonObjectAddress = new JsonObject();
jsonObjectAddress = jsonParser.parse(bufferRead).getAsJsonObject().getAsJsonObject("address");
Set<Entry<String, JsonElement>> entrySetProperties = jsonObjectAddress.entrySet();

Хочу понять:

jsonParser.parse(bufferRead) возвращает экземпляр класса JsonElement, который является родительским классом класса JsonObject.

И JsonObject класс имеет ниже переменную Instnce и состоит из всех атрибутов JSON с парой ключ-значение.

private final LinkedTreeMap<String, JsonElement> members =
      new LinkedTreeMap<String, JsonElement>();

Мне просто интересно узнать, где и кто заполняет этоmembers, потому что он присутствует в дочернем классе как переменная экземпляра, а jsonParser.parse(bufferRead) возвращает только экземпляр JsonElement ...!

Могу я узнать, пожалуйста, как это работает ...?Любая помощь будет признательна, чтобы узнать больше ...!

Обновление:

Когда я запускаю это

jsonObjectAddress = jsonParser.parse(bufferRead).getAsJsonObject();
Set<Entry<String, JsonElement>> entrySetProperties = jsonObjectAddress.entrySet();
for(Map.Entry<String, JsonElement> entry: entrySetProperties) {

    System.out.println(entry.getValue().getClass());

    System.out.println(entry.getKey()+":"+ entry.getValue());
}

Это дает мне следующий результат

class com.google.gson.JsonPrimitive
empID:100
class com.google.gson.JsonPrimitive
name:"David"
class com.google.gson.JsonPrimitive
permanent:false
class com.google.gson.JsonObject
address:{"street":"BTM 1st Stage","city":"Bangalore","zipcode":560100}
class com.google.gson.JsonArray
phoneNumbers:[123456,987654]
class com.google.gson.JsonPrimitive
role:"Manager"
class com.google.gson.JsonArray
cities:["Los Angeles","New York"]
class com.google.gson.JsonObject
properties:{"age":"28 years","salary":"1000 Rs"}

Выше приведено значение member переменной индекса класса JsonObject.Но если вы видите, что одним из значений в member set является JsonObject, тоже само по себе.

Так что если я запускаю так

jsonObjectAddress = jsonParser.parse(bufferRead).getAsJsonObject().getAsJsonObject("address");

Это представляет то же значение типа JsonObject, котороехранится для имени ключа addreess в member и показывает результаты, подобные этому

class com.google.gson.JsonPrimitive
street:"BTM 1st Stage"
class com.google.gson.JsonPrimitive
city:"Bangalore"
class com.google.gson.JsonPrimitive
zipcode:560100

Я запутался здесь, ключ address в member имеет JsonObject, поэтому при извлечении только адреса`, тогда как он может вернуть entryset () ...?

1 Ответ

1 голос
/ 09 июня 2019

В результате синтаксического анализа строки 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 в целом) имеет поля с именами «имя», «адрес», «роль» и т. Д., И, следовательно, его карта содержит ключи «имя», «адрес», «роль» и т. д. Объект, представляющий «адрес», имеет поля с названиями «улица», «город» и т. д., и, следовательно, его карта содержит ключи «улица», «город» и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...