GSON:当 运行 jar 文件时出现 MalformedJsonException(在 Eclipse 中工作正常)
GSON: MalformedJsonException when running the jar file (works fine in Eclipse)
这是我第一次post来到这里,希望有人能帮助我解决这个问题,因为我不明白哪里出了问题。
我有一个 java 方法来解析 JSON String
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";
}
其中事件是字符串,字段是我感兴趣的字段。该程序在 运行ning on 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": "000000428d8006442ef91f3ed48e27", "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": "0023200b0a234e82865474b11fd9cd", "peer_type": "channel", "peer_id": 123232323, "print_name": "ChnNameTest", "flags": 19609, "title": "ChnNameTest", "participants_count": 0, "admins_count": 0, "kicked_count": 0}, "to": {"id": "1200000b0a2a54e812345674b47fd9cd", "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"}
我正在尝试获取 "from" 对象下的 "id" 字段。我也尝试过使用另一个库 (org.json),但行为是一样的。同样,如果我 运行 日食上的代码它正在工作。
我真的不知道该尝试什么...希望有人能帮助我!
谢谢!
更新:
问题似乎与传递的字符串有关。所以这是一段代码,它读取我正在调用的脚本的标准输出(发回 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\": \"000000428d8006442ef91f3ed48e27\", \"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\": \"0023200b0a234e82865474b11fd9cd\", \"peer_type\": \"channel\", \"peer_id\": 123232323, \"print_name\": \"ChnNameTest\", \"flags\": 19609, \"title\": \"ChnNameTest\", \"participants_count\": 0, \"admins_count\": 0, \"kicked_count\": 0}, \"to\": {\"id\": \"1200000b0a2a54e812345674b47fd9cd\", \"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);
输出:
0023200b0a234e82865474b11fd9cd
谢谢@Nephilim!
通过以下方式解决:
event=event.trim();
event=event.replace("[K","");
在 event.trim();
之后,字符串的开头有一个“[K”,这在之前是不可见的。删除“[K”后一切正常!
trim "extended" 可能是一些隐藏的字符。
这是我第一次post来到这里,希望有人能帮助我解决这个问题,因为我不明白哪里出了问题。
我有一个 java 方法来解析 JSON String
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";
}
其中事件是字符串,字段是我感兴趣的字段。该程序在 运行ning on 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": "000000428d8006442ef91f3ed48e27", "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": "0023200b0a234e82865474b11fd9cd", "peer_type": "channel", "peer_id": 123232323, "print_name": "ChnNameTest", "flags": 19609, "title": "ChnNameTest", "participants_count": 0, "admins_count": 0, "kicked_count": 0}, "to": {"id": "1200000b0a2a54e812345674b47fd9cd", "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"}
我正在尝试获取 "from" 对象下的 "id" 字段。我也尝试过使用另一个库 (org.json),但行为是一样的。同样,如果我 运行 日食上的代码它正在工作。 我真的不知道该尝试什么...希望有人能帮助我! 谢谢!
更新: 问题似乎与传递的字符串有关。所以这是一段代码,它读取我正在调用的脚本的标准输出(发回 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\": \"000000428d8006442ef91f3ed48e27\", \"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\": \"0023200b0a234e82865474b11fd9cd\", \"peer_type\": \"channel\", \"peer_id\": 123232323, \"print_name\": \"ChnNameTest\", \"flags\": 19609, \"title\": \"ChnNameTest\", \"participants_count\": 0, \"admins_count\": 0, \"kicked_count\": 0}, \"to\": {\"id\": \"1200000b0a2a54e812345674b47fd9cd\", \"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);
输出:
0023200b0a234e82865474b11fd9cd
谢谢@Nephilim!
通过以下方式解决:
event=event.trim();
event=event.replace("[K","");
在 event.trim();
之后,字符串的开头有一个“[K”,这在之前是不可见的。删除“[K”后一切正常!
trim "extended" 可能是一些隐藏的字符。