簡體   English   中英

GSON:運行jar文件時出現MalformedJsonException(在Eclipse中工作正常)

[英]GSON: MalformedJsonException when running the jar file (works fine in Eclipse)

這是我在這里的第一篇文章,希望有人可以幫助我,因為我不明白怎么了。

我有一個解析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();

這對我有用。

        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

謝謝@Nephilim!

通過執行以下操作解決了該問題:

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

之后event.trim(); 字符串開頭有一個[[K],以前是不可見的。 刪除“ [K”之后,一切正常! 可能是一些隱藏的char修飾了“ extended”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM