【问题标题】:parsing json with java用java解析json
【发布时间】:2011-07-01 06:29:16
【问题描述】:

我是 json 解析的新手,我从一个请求中抓取了一个 json 字符串,现在我需要用 java 解析它。我为此使用 json-lib。但我真的被困住了,因为我不熟悉它。我需要提取以下数据

1. name (hotel name)
2. starRating
3. geoPoint

我为此使用了以下 java 代码,但它没有给我需要的结果,请有人帮助我...

非常感谢!

java代码(s是我得到的json字符串)

JSONObject json = (JSONObject) JSONSerializer.toJSON(s);    
JSONArray jarray = json.getJSONArray("hotels");
for(int i=0 ; i < jarray.size(); i++) {
System.out.println("jarray [" + i + "] --------" + jarray.getString(i));
}

json 我需要解析

[
{
    "total": 250,
    "offset": 0,
    "requestID": "-btygi09oxfov",
    "locationName": "Paris, France",
    "locationLatitude": 48.86,
    "locationLongitude": 2.34,
    "cityCode": "PARIS_J_FR",
    "hotels": [
        {
            "ypid": "YN10001x300073304",
            "id": 56263,
            "hotelRateIndicator": "2",
            "name": "Renaissance Paris Vendome Hotel",
            "brandCode": "69",
            "addressLine1": "4 Rue du Mont-Thabor",
            "city": "Paris",
            "neighborhood": "",
            "state": "IdF",
            "country": "US",
            "cachedPrice": 935,
            "geoPoint": [
                48.865361,
                2.329584
            ],
            "starRating": "5",
            "thumbnailUrl": "http://www.orbitz.com//public/hotelthumbnails/53/97/85397/85397_TBNL_1246535840051.jpg",
            "total": 250,
            "amenities": [
                "24",
                "31",
                "42",
                "52",
                "9"
            ],
            "telephoneNumbers": [
                ""
            ],
            "popularity": 837
        },
        {
            "ypid": "YN10001x300073331",
            "id": 112341,
            "hotelRateIndicator": "3",
            "name": "Renaissance Paris Arc de Triomphe Hotel",
            "brandCode": "69",
            "addressLine1": "39 Avenue de Wagram",
            "city": "Paris",
            "neighborhood": "",
            "state": "IdF",
            "country": "US",
            "cachedPrice": 633,
            "geoPoint": [
                48.877107,
                2.297451
            ],
            "starRating": "5",
            "thumbnailUrl": "http://www.orbitz.com//public/hotelthumbnails/21/72/302172/302172_TBNL_1246535872514.jpg",
            "total": 250,
            "amenities": [
                "24",
                "31",
                "42",
                "9"
            ],
            "telephoneNumbers": [
                ""
            ],
            "popularity": 796
        }           
  ]         
}           
  ]

【问题讨论】:

  • 什么不起作用?你有错误吗?还是没有获得您需要的数据?
  • @adrin : 我在线程 "main" java.lang.ClassCastException 中得到一个异常 Exception: net.sf.json.JSONArray cannot be cast to net.sf.json.JSONObject

标签: java json json-lib


【解决方案1】:

任何 JSON 对象都可以表示为 Map&lt;String, Object&gt;

使用像jackson(spring 附带)这样的库,它可以像这样将 json 反序列化为 Map:

Map<String, Object> obj = new ObjectMapper().readValue(json, new TypeReference<Map<String, Object>>());

slower,但谷歌品牌,GSON,可以像这样使用。

Map<String, Object> obj = new Gson().fromJson(json, HashMap.class);

【讨论】:

  • 感谢您的建议,但我必须使用 json-lib :)
  • 哎呀 - 2 票否决?老实说,gson 可以很容易地从 json 构建 java 对象,反之亦然。无论如何...
  • 我刚刚对 java 中一些最流行的 json 库做了一个基准测试。当我看到 GSON 是性能最差的现代图书馆时,我感到很震惊(有更老更差的图书馆)。如果您不相信我,请自行查看:github.com/fabienrenaud/java-json-benchmark 之前我一直认为杰克逊和 gson 的表现相似......杰克逊在这张照片中显然是赢家。
  • @fab 很好,因为自从我发布这个答案以来,我一直在使用 jackson,不是因为它更快,而是因为它与 spring boot 一起开箱即用,我一直在使用很多最近几年。我已经更新了答案,包括杰克逊和你的基准的链接。
【解决方案2】:

要通过 ClassCastException,您只需要进行它告诉您的更改:将输入作为数组而不是作为对象处理。

JSONArray outerArray = (JSONArray) JSONSerializer.toJSON(s);
JSONObject json = (JSONObject) outerArray.get(0);
JSONArray jarray = json.getJSONArray("hotels");
for (int i = 0; i < jarray.size(); i++)
{
  System.out.println("jarray [" + i + "] --------" + jarray.getString(i));
}

还有,这是获取每个酒店名称的示例。

JSONArray outerArray = (JSONArray) JSONSerializer.toJSON(s);
JSONObject json = (JSONObject) outerArray.get(0);
JSONArray jarray = json.getJSONArray("hotels");
for (int i = 0; i < jarray.size(); i++)
{
  JSONObject hotel = jarray.getJSONObject(i);
  String name = hotel.getString("name");
  System.out.println(name);
}

【讨论】:

  • 非常感谢您的回答... :)
【解决方案3】:

我推荐 Djson 解析器(java 库)。 https://github.com/jungkoo/djson_parser

代码:

Var hotels = Djson.parse(new File("d:\\sample1.txt")).find("[0].hotels");

for(int i=0; i<hotels.size(); i++) {            
  System.out.println(hotels.get(i).get("name").toString());
  System.out.println(hotels.get(i).get("starRating").toInt());
  System.out.println(hotels.get(i).find("geoPoint").get(0).toDouble()); // case1) basic
  System.out.println(hotels.get(i).find("geoPoint[1]").toDouble()); // case2) find()    
  System.out.println();
}

输出:

Renaissance Paris Vendome Hotel 5
48.865361
2.329584

Renaissance Paris Arc de Triomphe Hotel 5
48.877107
2.297451

【讨论】:

    【解决方案4】:

    下载json-lib并使用JSONObject

    让我们说{"name": "joe", "age": 33}

    这样做

    JSONObject jobject=new JSONObject(jsonstring);
    String name=jobject.getString("name");
    

    【讨论】:

      【解决方案5】:

      我已经启动了一个名为 JsonQuery 的 github 项目项目,它使这种事情变得更容易。

      该项目建立在 GSON 之上。

      例如,如果您想检索酒店的名称,可以这么简单:

      JsonQuery $ = JsonQuery.fromJson(s); 
      $.val("hotels.name");
      

      这是链接:

      https://github.com/rdbeach/JsonQuery

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-20
        • 1970-01-01
        • 1970-01-01
        • 2013-01-24
        • 2012-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多