检查json数组中是否有格式错误的对象

时间:2013-08-20 16:50:01

标签: android json gson

我试图将一个对象列表放到一个数组中,当对象都很好时它可以正常工作,但是当我得到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)

2 个答案:

答案 0 :(得分:2)

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

使用try catch不会帮助您解决服务器代码中的错误,因此,为了捕获确切的问题,您只需按照以下步骤操作:

1)我复制了所有json并在在线json验证工具

中验证了它

例如:

  1. http://jsonlint.com/
  2. http://json.parser.online.fr/
  3. 如果您自己是服务器端开发人员,那么这两个工具都非常高效,并指出您确切的错误,然后您可以轻松修复它,否则请告诉您的可怜开发人员修复它。

    希望这是详细的答案。

答案 1 :(得分: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字符串的服务器上修复此问题。正确地逃避价值是很重要的。在PHP中,你有json_encode(...)方法,带有用于转义的参数(PHP 5.3或更新版本)它的内容。