【问题标题】:JSON parsing. Unexpected character (t) at position 2. JAVAJSON解析。位置 2 的意外字符 (t)。JAVA
【发布时间】:2013-02-22 14:19:30
【问题描述】:

我正在尝试解析来自谷歌地图搜索的 JSON 数据。 我已经尝试过 JACKSON,现在我正在尝试 JSON SIMPLE。他们都给出了同样的错误。

首先我在谷歌地图上进行搜索。

String urlString = "http://maps.google.com/maps?f=q&source=s_q&output=json&start=0&q="+ "Stockholm" + "+Gym";

给我 JSON while(1);{title:"stockholm Gym - Google Maps",url:"/maps?f=q\x26source=s_q\x26start=0\x26q=stockholm+Gym\x26ie=UTF8\ x26hq=健身房........等等。 我正在替换 while(1);和 ””;在我返回字符串之前。

当我试图解析它时遇到的问题

JSONParser parser = new JSONParser();

    String jsonString = "";

// UriHandler.mapSearchJson是返回jsonString的方法。

    String jsonData = UriHandler.mapSearchJSON(jsonString);

    Object obj = "";
    try {

        obj = parser.parse(jsonData);

    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    JSONObject jsonObj = (JSONObject) obj;

    String title = (String) jsonObj.get("title");
    System.out.println(title);

这给了我一个例外。 位置 2 出现意外字符 (t)。

当我调试它时。一直到它试图解析字符串时。那么 obj 就是 = null。

我到底做错了什么。

谢谢!

【问题讨论】:

  • 请注意,JSON 的规则比 JavaScript 对象字面量的规则更严格。不带引号的字段名称在对象文字中是可以的,但在 JSON 中则不行。

标签: java json parsing


【解决方案1】:

正如其他人已经提到的,不带引号的字段名称不是标准的 JSON。但是,Jackson(可能还有其他人)有一个 set of option settings,它允许它使用非标准但常见的 JSON 衍生产品:

JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES

将启用不带引号的字段名称的处理。

【讨论】:

    【解决方案2】:

    响应不是有效的 JSON,因为键名没有用双引号引起来。

    【讨论】:

      【解决方案3】:

      {title:"斯德哥尔摩体育馆"

      是无效的JSON,应该是这样的:

      {"title":"stockholm Gym" 
      

      注意title 是如何被" 双引号括起来的

      【讨论】:

        【解决方案4】:

        您正在撤回供maps.google.com 站点使用的Javascript 代码

        该响应中可能包含任何 Javascript 代码,而不仅仅是作为搜索的一部分返回的 JSON。

        您需要改为从他们的地图 API 请求:

        http://maps.googleapis.com/maps/api/geocode/json?address=Stockholm+Gym&sensor=false

        这将只返回 JSON 数据。

        查看Google Maps API 了解更多选项。

        【讨论】:

          【解决方案5】:

          我在尝试解析从 kafka(kafka twitter 制作人)返回的 json 时遇到了这个错误。

          返回的消息包含除 json 之外的一些额外文本 (KeyedMessage(twitter-test_english,null,null)。因此我遇到了这个错误。

          KeyedMessage(twitter-test_english,null,null,{"created_at":"Sat Apr 23 18:31:10 +0000 2016","id":723942306777337856,"id_str":"723942306777337856"}
          

          仅从返回的 json 传递消息部分并将其转换为字符串。

          {"created_at":"Sat Apr 23 18:31:10 +0000 2016","id":723942306777337856,"id_str":"723942306777337856"}
          
          message = new KeyedMessage("twitter-test_english", (String)queue.take());
          //System.out.println("This is message"+message.message());
          String message_string = message.message().toString();
          JsonParse.toParseJson(message_string);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-05-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-02-08
            • 2020-10-16
            • 1970-01-01
            相关资源
            最近更新 更多