我试图在下面的代码片段中理解父类和子类的实例作用域或它们的行为。(通过GSON框架实现底层的GSON功能)
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类中有以下实例变量,它由所有带有键值对的JSON属性组成。
private final LinkedTreeMap<String, JsonElement> members =
new LinkedTreeMap<String, JsonElement>();我只是好奇地想知道,在哪里以及谁在填充这个members,因为它作为实例变量出现在孩子的类中,而jsonParser.parse(bufferRead)只返回JsonElement实例...!
我可以知道它是如何工作的吗?如果希望了解更多信息,ANy help将不胜感激...!
更新:
当我运行以下代码时
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"}上面的结果是JsonObject类的member依赖变量的值。但是,如果您看到member集合中的一个值也是JsonObject本身。
所以如果我像这样跑
jsonObjectAddress = jsonParser.parse(bufferRead).getAsJsonObject().getAsJsonObject("address");它表示与member中名为addreess键存储在一起的JsonObject类型的值,并显示如下结果
class com.google.gson.JsonPrimitive
street:"BTM 1st Stage"
class com.google.gson.JsonPrimitive
city:"Bangalore"
class com.google.gson.JsonPrimitive
zipcode:560100我搞不懂了,member中的address键有JsonObject,所以当我们只提取地址`时,它怎么能返回entryset()呢?
发布于 2019-06-09 23:38:43
解析器在解析JSON字符串后创建一个JsonElements树,它的返回值是作为该树的根的元素。谁“负责”填充成员集的答案是解析器;解析器负责解析输入。
不需要“联系”;有一种与JSON等效的数据结构。例如,如果JSON是
{ "stuff" : { "foo" : "F" , "bar" : "B" } }然后,顶级JsonObject中的映射有一个条目,键值为“JsonObject”,该条目的值是一个JsonPrimitive,它的映射有两个条目,键值为"foo“和"bar",它们的值是填充值,在本例中是字符串。
随后的"get“操作将从该树中检索节点。
当你写这篇文章的时候:
private static JsonObject jsonObjectAddress = new JsonObject();您分配了一个从未使用过的新JsonObject,因为在下一行
jsonObjectAddress = ...将变量设置为不同的JsonObject,该the存在于解析器创建的树结构中。
编辑了更多:
也许我误解了您对父/子术语的使用。我将其解释为引用对象树中的父/子关系。但您似乎也提到了超类/子类关系。
我觉得你看错了。没有单独的"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字符串)具有名为"name“、"address”、"role“等的字段,因此其map包含键"name”、"address“、"role”等。表示"address“的对象具有名为"street”、"city“等的字段,因此其map包含键"street”、"city“等。
https://stackoverflow.com/questions/56515879
复制相似问题