1

我正在尝试将对象列表放入数组中,当对象都很好时,它可以正常工作,但是当我得到 4000 条记录时,很难看出哪个是格式错误的。我如何检查字符串的哪一部分格式错误或跳过该特定对象..如果我能指出它格式错误的位置会更好,但就像我说的那样,对于 4000 条记录,错误对我没有多大帮助。这是我的代码:

JsonParser parser = new JsonParser();
JsonReader jreader = new JsonReader(new StringReader(result));
jreader.setLenient(true);

JsonElement elem = parser.parse(reader); //throws malformed json error
JsonArray contacts = elem.getAsJsonArray();

Gson converter = new Gson();
ContactObject obj = null;

Type cons = new TypeToken<ArrayList<Contact>>(){}.getType();
temp = converter.fromJson(contacts, cons);

这是错误:

com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Unterminated object at line 1 column 38670
    at com.google.gson.internal.Streams.parse(Streams.java:56)
    at com.google.gson.JsonParser.parse(JsonParser.java:84)
    at com.android.companya.ContactServer$APICalls.doInBackground(APIServer.java:737)
    at com.android.companya.ContactServer$APICalls.doInBackground(APIServer.java:1)
    at android.os.AsyncTask$2.call(AsyncTask.java:287)
    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
    at java.lang.Thread.run(Thread.java:856)
 Caused by: com.google.gson.stream.MalformedJsonException: Unterminated object at line 1 column 38670
    at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1310)
    at com.google.gson.stream.JsonReader.nextInObject(JsonReader.java:722)
    at com.google.gson.stream.JsonReader.peek(JsonReader.java:382)
    at com.google.gson.stream.JsonReader.hasNext(JsonReader.java:349)
    at com.google.gson.internal.bind.TypeAdapters$25.read(TypeAdapters.java:657)
    at com.google.gson.internal.bind.TypeAdapters$25.read(TypeAdapters.java:650)
    at com.google.gson.internal.bind.TypeAdapters$25.read(TypeAdapters.java:633)
    at com.google.gson.internal.Streams.parse(Streams.java:44)
4

2 回答 2

3

当来自服务器的 json 无效时,我们肯定会收到此错误。

使用 try catch 不会帮助您解决服务器代码中的问题,因此,为了捕捉确切的问题,您只需执行以下步骤:

1)我复制了所有的 json 并在在线 json 验证器工具中对其进行了验证

例如:

  1. http://jsonlint.com/
  2. http://json.parser.online.fr/

如果您自己是服务器端开发人员,这两种工具都非常有效,并且可以为您指出确切的错误,然后您可以轻松修复它,否则告诉您可怜的开发人员修复它。

希望这是详细的答案。

于 2014-01-08T11:03:47.137 回答
1

只需使用try/catch构造。这就是它的意义所在。

JsonParser parser = new JsonParser();
JsonReader jreader = new JsonReader(new StringReader(result));
jreader.setLenient(true);

try {
    JsonElement elem = parser.parse(reader); //throws malformed json error
    JsonArray contacts = elem.getAsJsonArray();

    Gson converter = new Gson();
    ContactObject obj = null;

    Type cons = new TypeToken<ArrayList<Contact>>(){}.getType();
    temp = converter.fromJson(contacts, cons);
} catch(JsonSyntaxException ex) {
    // Inform then user that the the Json data contains invalid syntax
}

您也不能跳过格式错误的对象。整个结果要么有效,要么无效。您必须在创建 Json 字符串的服务器上解决此问题。正确转义值很重要。在 ie PHP 中,您有json_encode(...)带有转义参数的方法(PHP 5.3 或更高版本)它的内容。

于 2013-08-20T16:58:46.253 回答