使用JSONP浏览json,可以将一个数字作为JsonObject返回吗?

时间:2017-07-18 22:06:35

标签: java json inheritance jsonp

我正在编写一个函数,通过给定坐标的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,其中可以包含JsonValueString等类型。请参阅: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"

1 个答案:

答案 0 :(得分:1)

Json有4个主要类型:Object,Array,number和string这些类型对应于:Map类型,List,BigDecimal和java类型的String。因此,对于每种类型的对象,您必须调用正确的函数:getJsonObjectgetJsonArraygetJsonNumbergetJsonString。你不能在JsonNumber上使用getJsonObject,这会导致你的错误。

对于你的情况,你不能反序列化你的json,所以我建议你我的解决方案是将它解析为Map,然后循环抛出这个地图以获得你想要的值。这是example code