我正在编写一个函数,通过给定坐标的json导航。例如:
{
"a": {
"b" : "c"
},
"d": {
...
}
}
如果我打电话
NavigateThroughJson("a.b", myJsonObject)
我应该以{{1}}作为输出。我这样做因为我不能使用反序列化,json有任意格式。这是我的功能:
"c"
问题在于,当我为以下json尝试此操作时(并调用NavigateThroughJson(“high”,jsonAbove)):
public JsonValue NavigateThroughJson(String coordinates, JsonObject jsonObject) {
JsonObject o = jsonObject;
String[] nodes = coordinates.split("\\.");//Splits the dot
for (String node: nodes) {
node = node.replace("\"", ""); //Removes "" from the keys
o = o.getJsonObject(node);
}
return o;
}
没有返回任何内容,就像{"high":7999.0,"vol":1261.83821469,"buy":7826.01,"last":7884.0,...}
没有返回任何内容,甚至没有返回o.getJsonObject(...)
。
我认为这是因为“high”指向Number而不是真正的json对象,如null
,即使一致的库应该high: {...}
作为带有7999.0
的JsonObject返回Type
。如您所见,Number
实现了JsonObject
,其中可以包含JsonValue
,String
等类型。请参阅:https://docs.oracle.com/javaee/7/api/javax/json/JsonValue.html
但是,由于jsonObject也实现了Number
,例如我可以在Map<String, JsonValue>
时获取数字,但我不认为这是正确的方法,如果“高” “指向不是map.get("high")
的另一个JsonValue
(例如,它是json块Number
),然后我需要将此{}
视为JsonValue
,但铸造不是最好的事情。
更新:
此库似乎存在错误。请记住,json键是带有“”的字符串,所以如果我尝试:
Map<String, JsonValue>
它不会打印任何内容,甚至不会打印 System.out.println(jsonObject.getJsonObject("high"));
System.out.println("hello?");
以上!但是,如果我这样做:
"hello?"
System.out.println(jsonObject.getJsonObject("\"high\""));
System.out.println("hello?");
已打印,但其上方的打印件为"hello?"
,即使我确定,键"null"
(带“”)存在因为我之前打过"high"
。
答案 0 :(得分:1)
Json有4个主要类型:Object,Array,number和string这些类型对应于:Map类型,List,BigDecimal和java类型的String。因此,对于每种类型的对象,您必须调用正确的函数:getJsonObject
,getJsonArray
,getJsonNumber
或getJsonString
。你不能在JsonNumber上使用getJsonObject,这会导致你的错误。
对于你的情况,你不能反序列化你的json,所以我建议你我的解决方案是将它解析为Map,然后循环抛出这个地图以获得你想要的值。这是example code。