【问题标题】:GSON: MalformedJsonException when running the jar file (works fine in Eclipse)GSON:运行 jar 文件时出现 MalformedJsonException(在 Eclipse 中运行良好)
【发布时间】:2018-04-04 15:25:39
【问题描述】:

这是我在这里的第一篇文章,希望有人可以帮助我,因为我不明白出了什么问题。

我有一个解析 JSON 字符串的 java 方法

    public static String getFieldFrom(String field, String event) {
    try {
        JsonElement jelement = new JsonParser().parse(event);
        JsonObject  obj = jelement.getAsJsonObject();
        return obj.getAsJsonObject("from").get(field).getAsString();            
    }catch(Exception e) {
        System.out.println("Error parsing field " + field + ": " + e);
    }       
    return "-1";
}

事件是字符串,字段是我感兴趣的字段。程序在eclipse上运行时运行良好。如果我将它编译为 jar 并尝试运行它,我会得到一个异常:

com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 3 path $

正在处理的 JSON 字符串是相同的,这个(对我来说似乎有效):

{"event": "message", "id": "00000000b0a2a54e1a01000000000000d", "flags": 258, "fwd_from": {"id": "$01000000428d8006442ef91f3ed48e27", "peer_type": "user", "peer_id": 109088066, "print_name": "Sample_Name", "flags": 1, "first_name": "Name", "last_name": "Sample", "username": "sampleuser"}, "fwd_date": 1522850949, "from": {"id": "$050023200b0a234e82865474b11fd9cd", "peer_type": "channel", "peer_id": 123232323, "print_name": "ChnNameTest", "flags": 19609, "title": "ChnNameTest", "participants_count": 0, "admins_count": 0, "kicked_count": 0}, "to": {"id": "$011200000b0a2a54e812345674b47fd9cd", "peer_type": "channel", "peer_id": 1319412121236, "print_name": "ChnNameTest", "flags": 196609, "title": "ChnNameTest", "participants_count": 0, "admins_count": 0, "kicked_count": 0}, "out": true, "unread": false, "service": false, "date": 1522850949, "text": "This is the message text"}

我正在尝试获取“来自”对象下的“id”字段。我也尝试过使用另一个库(org.json),但行为是一样的。同样,如果我在 Eclipse 上运行代码,它就可以工作。 我真的不知道该尝试什么...希望有人可以帮助我! 谢谢!

更新: 问题似乎与传递的字符串有关。所以这是一段代码,它读取我正在调用的脚本的标准输出(发送回 json 文本)。

    Process child = Runtime.getRuntime().exec(command);
    InputStream in = child.getInputStream();
    int c;
    char ca;
    String line="";
    while ((c = in.read()) != -1) { //Read stdout char by char
          ca=(char)c;
          if(ca=='\n' || ca=='\r') { //Got a line
            if(line.contains("{\"event\":")) {  
                System.out.println(getFieldFrom("id",line)));
            }                   
            line="";
          }else {
            line=line+ca;
          }
      }
      in.close();

【问题讨论】:

  • 你确定你在运行你的 jar 时实际上得到了相同的预期 JSON 文件(从我假设是命令行)?
  • 是的。您看到的 JSON 字符串打印在 catch 子句中
  • 我对 GSON 不太熟悉了,但也许 $ 字符是问题所在...不确定JsonReader 的宽大设置在从您的 IDE 运行和命令行,但这可能是您调试它的关键。
  • 感谢您的回答@Mena 不幸的是没有运气。删除 $ 没有帮助
  • 没问题。希望其他人会有更好的线索。

标签: java json parsing gson org.json


【解决方案1】:

这对我有用。

        String json="{\"event\": \"message\", \"id\": \"00000000b0a2a54e1a01000000000000d\", \"flags\": 258, \"fwd_from\": {\"id\": \"$01000000428d8006442ef91f3ed48e27\", \"peer_type\": \"user\", \"peer_id\": 109088066, \"print_name\": \"Sample_Name\", \"flags\": 1, \"first_name\": \"Name\", \"last_name\": \"Sample\", \"username\": \"sampleuser\"}, \"fwd_date\": 1522850949, \"from\": {\"id\": \"$050023200b0a234e82865474b11fd9cd\", \"peer_type\": \"channel\", \"peer_id\": 123232323, \"print_name\": \"ChnNameTest\", \"flags\": 19609, \"title\": \"ChnNameTest\", \"participants_count\": 0, \"admins_count\": 0, \"kicked_count\": 0}, \"to\": {\"id\": \"$011200000b0a2a54e812345674b47fd9cd\", \"peer_type\": \"channel\", \"peer_id\": 1319412121236, \"print_name\": \"ChnNameTest\", \"flags\": 196609, \"title\": \"ChnNameTest\", \"participants_count\": 0, \"admins_count\": 0, \"kicked_count\": 0}, \"out\": true, \"unread\": false, \"service\": false, \"date\": 1522850949, \"text\": \"This is the message text\"}";
    Gson gson = new Gson();
    JsonObject obj = gson.fromJson(json, JsonElement.class).getAsJsonObject();
    String str = obj.getAsJsonObject("from").get("id").getAsString();
    System.out.println(str);

输出:

$050023200b0a234e82865474b11fd9cd

【讨论】:

  • 谢谢。如果我在代码中将 JSON 指定为 String 也适用于我。如果我从标准输出得到字符串,它不会。我复制了两个字符串,它们看起来一样。某处可能有一些看不见的字符?
  • 你能检查一下吗 - Gson gson = new GsonBuilder().setLenient().create();
  • Error parsing field id: com.google.gson.JsonIOException: JSON document was not fully consumed. com.google.gson.JsonIOException: JSON document was not fully consumed. at com.google.gson.Gson.assertFullConsumption(Gson.java:861) at com.google.gson.Gson.fromJson(Gson.java:854) at com.google.gson.Gson.fromJson(Gson.java:802) at com.google.gson.Gson.fromJson(Gson.java:774) at base.CliServer.getFieldFrom(CliServer.java:123) at base.CliServer.messageListener(CliServer.java:41) at base.Main.main(Main.java:6) 仍然无法解析 JSON 字符串
  • 最后一件事,您可以尝试执行以下操作吗-event=event.trim(); JsonObject obj = gson.fromJson(event, JsonElement.class).getAsJsonObject();
  • 解决了这个问题! event.trim 在字符串的开头显示一个隐藏的字符。删除该字符会使 JSON 有效。谢谢
【解决方案2】:

感谢@Nephilim!

通过这样做解决了它:

event=event.trim();
event=event.replace("[K","");

event.trim(); 之后,字符串在开始时有一个“[K”,这在之前是不可见的。删除“[K”后一切正常! 这可能是一些隐藏的字符,修剪“扩展”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    相关资源
    最近更新 更多