寻找一种在Android(Java)中解析JSON的简洁方法

时间:2015-10-25 19:11:01

标签: java android json gson

我正在编写一个使用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对象(即我仍然需要解析每一层)

2 个答案:

答案 0 :(得分:1)

结帐GSONJacksonMoshi

答案 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");