【问题标题】:Navigating though a json using JSONP, can a number be returned as a JsonObject?使用 JSONP 在 json 中导航,可以将数字作为 JsonObject 返回吗?
【发布时间】:2023-04-03 08:34:01
【问题描述】:

我正在编写一个函数,它在给定坐标的 json 中导航。例如:

{
 "a": {
    "b" : "c"
 },
 "d": {
   ...
 }
}

如果我打电话

NavigateThroughJson("a.b", myJsonObject)

我应该得到"c" 作为输出。我这样做是因为我不能使用反序列化,json 具有任意格式。这是我的功能:

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;
}

问题是,当我为以下 json 尝试此操作时(并调用 NavigateThroughJson("high", jsonAbove)):

{"high":7999.0,"vol":1261.83821469,"buy":7826.01,"last":7884.0,...}

什么都没有返回,就像o.getJsonObject(...)什么都没有返回,甚至null都没有。

我认为这是因为“high”指向一个数字而不是真正的 json 对象,如 high: {...},即使一致的库应该返回 7999.0 作为带有 Type Number 的 JsonObject。可以看到,JsonObject实现了JsonValue,可以有StringNumber等类型。见:https://docs.oracle.com/javaee/7/api/javax/json/JsonValue.html

但是,由于 jsonObject 也实现了Map<String, JsonValue>,例如,当我执行map.get("high") 时,我可以获得数字,但我认为这不是正确的方法,如果“high”指向另一个JsonValue 不是 Number(例如,它是一个 json 块 {}),那么我需要将此 JsonValue 视为 Map<String, JsonValue>,但强制转换不是最好的选择。

更新

这个库似乎有一个错误。请记住,json键是带有“”的字符串,所以如果我尝试:

    System.out.println(jsonObject.getJsonObject("high"));
    System.out.println("hello?");

它不会打印任何东西,甚至上面的"hello?" 也不会打印!!!但是,如果我这样做:

    System.out.println(jsonObject.getJsonObject("\"high\""));
    System.out.println("hello?");

"hello?" 已打印,但上面的打印是 "null",尽管我确定密钥 "high"(带有“”)存在,因为我打印了 @987654350 @之前。

【问题讨论】:

  • 另外,有没有人知道如何在没有“”键的情况下读取 json?

标签: java json inheritance jsonp


【解决方案1】:

Json 有 4 种主要类型:Object、Array、number 和 string,这些类型对应于 java 类型中的 Map、List、BigDecimal 和 String。因此,对于每种类型的对象,您必须调用正确的函数:getJsonObjectgetJsonArraygetJsonNumbergetJsonString。您无法在 JsonNumber 上获取 JsonObject,从而导致您的错误。

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

【讨论】:

  • 有道理,我认为数字、字符串等也可以视为 JsonObjects
  • 另外,没有方法“instanceOf”
  • 另外,您正在比较 JsonObject 是不是一个数字、一个列表等,但在这个阶段它确实是一个 JsonObject。我应该看看键“high”的值是否是一个数字、一个列表等,但为此我需要先得到它,但是如何?
  • @LucasZanella 为了快速回复,我对“instanceOf”的语法有误,我已经为您编辑了完整解决方案的答案。
猜你喜欢
  • 2017-09-08
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 2015-02-03
  • 2013-02-16
  • 1970-01-01
相关资源
最近更新 更多