我正在编写一个使用JSON(来自Kimonolabs API)的应用程序,而我能够在Python中毫不费力地使用我的API:
results = json.loads(urllib.request.urlopen(KimonoAPIlink).read().decode('utf-8'))
返回可用的JSON字典:
title = results['results']['suart'][0]['stitle']['text']
href = results['results']['suart'][0]['stitle']['href']
在Java(特别是Android)中我必须这样做(使用Gson):
URL url = new URL(KimonoAPIlink);
HttpURLConnection request = (HttpURLConnection) url.openConnection();
request.connect();
JsonParser jp = new JsonParser(); //from gson
JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent()));
JsonObject rootobj = root.getAsJsonObject(); //May be an array, may be an object.
JsonElement x = rootobj.getAsJsonObject("results").getAsJsonArray("suart").get(0);
JsonObject y = x.getAsJsonObject();
title.setText(y.getAsJsonObject("stitle").getAsJsonPrimitive("text").toString().replace("\"", "").replace("\\","\""));
有没有办法做到这一点不那么冗长和复杂? (我的代码有效,我希望它更简单,更干净)
此外,我可以以某种方式将整个嵌套的JSON对象解析成有用的东西(比如python)并且不会重新解析我访问的每一层吗?
提前致谢。
编辑:我也看到人们在这里使用Apache commons.io,但我认为它不会返回一个不同的JSON对象(即我仍然需要解析每一层)
答案 0 :(得分:1)
答案 1 :(得分:0)
您正在寻找的是使用JsonPath进行查找,其中JSON坐标由一个字符串表示,其语法与您在Python中使用的语法非常相似(以及其他功能)。
例如,在您的情况下,它将是$.results.suart[o].stitle.text
。
快速查看文档和gson github表明它没有在gson中实现,尽管JsonReader
类确实支持返回该值的方法。
java中有一个库实现JsonPath(名为JsonPath)。这是您的案例的一行代码(忽略连接细节):
String result = JsonPath.parse("[some json]").read("$.results.suart[o].stitle.text");