java - 使用 JSONP 浏览 json,数字可以作为 JsonObject 返回吗?

标签 java json inheritance jsonp

我正在编写一个函数,通过给定坐标的 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”指向一个数字,而不是像high: {...}这样的真正的json对象。 ,即使一致的库应该返回 7999.0作为带有 Type 的 JsonObject Number 。如您所见,JsonObject实现JsonValue ,可以具有诸如 String 之类的类型, Number等参见:https://docs.oracle.com/javaee/7/api/javax/json/JsonValue.html

但是,由于 jsonObject 还实现了 Map<String, JsonValue> ,我可以得到号码map.get("high")例如,但我认为这不是正确的方法,如果“高”指向另一个 JsonValue那不是Number (例如,这是一个json block {}),那么我需要处理这个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"即使我确定 key "high" (带有“”)存在,因为我打印了 jsonObject之前。

最佳答案

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

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

关于java - 使用 JSONP 浏览 json,数字可以作为 JsonObject 返回吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45177891/

相关文章:

javascript - 将 JSON 对象的字段转换为标题大小写

c++ - 如何在单个案例中通过多个 catch block 使异常处理落空?

c++ - 模板类派生自非模板基类 : No access to base class variables?

java - Android opengl 顶点数组

javascript - 使用 simplePagination.js 显示 json 数据?

java - Toolkit.getDefaultToolkit().getLockingKeyState(...) 在程序执行期间从不更新

javascript - 如何将 JSON 对象中的数组从 javascript 传递到 asp.net mvc Controller 方法?

c++ - 从派生类中删除虚函数

Java 和 RFC 3986 URI 编码

java - 从字符串中提取两个具有千个分隔符的数字