【问题标题】:JSONParser returns Unexpected character () at position 0JSONParser 在位置 0 返回意外字符 ()
【发布时间】:2017-12-14 17:35:27
【问题描述】:

我在解析 JSON 时遇到问题。我总是尝试这样做,返回结果如下:位置0处的意外字符()。

public Object execute(HttpRequestBase request){
    DefaultHttpClient client = new DefaultHttpClient();
    HttpResponse response = null;
    Object object = null;

    try {
        response = client.execute(request);
        InputStream is = response.getEntity().getContent();
        BufferedReader br = new BufferedReader(new InputStreamReader((is)));
        StringBuilder builder = new StringBuilder();
        String output;

        while ((output = br.readLine()) != null) {
            builder.append(output).append("\n");    
        }

         if (response.getStatusLine().getStatusCode() == 200) { 
            object = new JSONParser().parse(builder.toString());
            client.getConnectionManager().shutdown();
        } else {
             LOG.log(Level.SEVERE, builder.toString());
             throw new RuntimeException(builder.toString());
         }

    } catch (IOException | ParseException ex) {
        LOG.log(Level.SEVERE, ex.toString());
    } finally {

    }

    return object;
}

PS:

  1. 我的响应返回格式正确的 JSON;
  2. 运行这段代码时会出现问题object = new JSONParser().parse(builder.toString());

这是我的 JSON 文件的一部分:

    [
   {
      "id":2115,
      "identificacao":"17\/2454634-6",
      "ultima_atualizacao":null
   },
   {
      "id":2251,
      "identificacao":"17\/3052383-2",
      "ultima_atualizacao":"2017-11-21"
   },
   {
      "id":2258,
      "identificacao":"17\/3070024-6",
      "ultima_atualizacao":null
   },
   {
      "id":2257,
      "identificacao":"17\/3070453-5",
      "ultima_atualizacao":null
   }
]

【问题讨论】:

  • 你能在解析之前显示builder的内容吗?我不明白您为什么要添加换行符,但从调试的角度来看会有所帮助。
  • JSON 在哪里?
  • 检查 JSON 输入,它可能以 UTF-8 BOM 开头,您需要在解析之前将其剥离。
  • @Eric 我确实将 JSON 放在了帖子的最后。

标签: java json jsonparser


【解决方案1】:

您的内容很可能在开头有一些未打印的特殊字符。对于 UTF-8 编码的数据,这可能是一个 BOM。

请将您的内容开头发布为byte[]

【讨论】:

  • 我的问题是“\\uFEFF”字符。 : (
  • BOM 符合预期)
  • 您可以添加 InputSteam 的实现,它将过滤响应流的第一个未绘制字符。
【解决方案2】:

这是因为 UTF-8 BOM 而发生的。 UTF-8 BOM 是什么? UTF-8 BOM 是一个字节序列 (EF BB BF),它允许阅读器将文件识别为以 UTF-8 编码。

通常,BOM 用于表示编码的字节顺序,但由于字节顺序与 UTF-8 无关,因此不需要 BOM。

如何解决问题? 将 .json 或任何文件的 encoding 转换为 UTF-8 而不是 UTF-8 BOM。 像这样。

【讨论】:

    【解决方案3】:

    用这个代替 BufferReader

    Map<String,Object> result 
                = (Map<String,Object>)JSONValue.parse(IOUtils.toString(response.getEntity().getContent(), "utf-8"));
    

    您会将 JsonData 放入 Map 中,然后您可以简单地遍历地图。

    【讨论】:

    • 需要导入import org.json.simple.JSONObject;导入 org.json.simple.JSONValue;
    • 我正在尝试这样做,但问题出在 BOM 上。谢谢。
    【解决方案4】:

    我相信您的问题在于内容类型。使用这样的东西:

    HttpEntity content = response.getEntity();
    StringBuilder sb = new StringBuilder();
    InputStream is = content.getContent();
    InputStreamReader isr = new InputStreamReader(is, "UTF-8");
    int character;
    do {
        character = isr.read();
        if (character >= 0) {
            sb.append((char) character);
        }
    } while (character >= 0);
    return sb.toString();
    

    不需要 BufferedReader,InputStreamReader 可以很好的处理。 希望对您有所帮助!

    【讨论】:

    • 我按照你写的那样做了,但是没有用! :(谢谢你的帮助!!
    【解决方案5】:

    我发现了问题!

    我的 JSON 返回了一个不同的空格字符,所以我确实在我的代码中添加了这个::

    String content = builder.toString();
    content = content.replaceAll("\\uFEFF", "");
    

    \uFEFF是我的问题!在我的开发环境中,它不会发生,只是在生产环境中!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 2020-12-07
      • 1970-01-01
      • 2013-09-06
      • 2017-01-26
      • 2018-10-09
      相关资源
      最近更新 更多