Gson MalformedJsonException

chanryma 2015-11-05 09:25:35
首先,非常感谢您能花时间在这个问题上。我已经搜索了很长时间,查看了很多类似问题。还是没有解决。
背景:
1. 客户端发送Get请求从服务器获取数据
2. 服务器返回的json格式的数据。返回结果还是比较长的,共1005741个字符。
3. 我用的Gson报json转成对象。

正常情况:
我在Eclipse中,在一个main方法中去获取数据,再解析,是没问题的。都能够用我定义的类还原出来。我想这应该能说明我定义的类是没问题的。
异常情况:
当我把同样的代码打到一个jar里,再做同样的事情,就出现了如下的异常。
com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Unterminated object at line 1 column 667
at com.google.gson.Gson.fromJson(Gson.java:769)
at com.google.gson.Gson.fromJson(Gson.java:721)
at com.google.gson.Gson.fromJson(Gson.java:670)
at com.google.gson.Gson.fromJson(Gson.java:642)


异常中说的第一行,第667列。我用Notepad++定位到第667列,第667列是个冒号':',,"id":2019, 就是id和2019中间的冒号。

json太长了,没办法贴近来。请原谅。

下面是我发送请求数据的方法,返回结果就是整改json结构:
    public static String sendGet(String url, String param) {
String result = "";
BufferedReader reader = null;
try {
if ((param != null) && (param.length() > 0)) {
url = url + "?" + param;
}
URL realUrl = new URL(url);
URLConnection connection = realUrl.openConnection();
setupConnection(connection);
connection.connect();
reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
result += line;
}
} catch (Exception e) {
LogUtil.error(e);
} finally {
release(reader);
}

return result;
}


我也试过把BufferedReader换成Google的JsonReader。也报同样的异常,同样的位置。

服务返回的json有问题?但是为什么在Eclipse中运行就是正常的?
读取返回结果的方式有问题?同样,为什么Eclipse中运行是正常的?
json太长?同样,为什么Eclipse中运行是正常的?
其他原因?
。。。

再次感谢您的时间!
...全文
644 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
chanryma 2015-11-07
  • 打赏
  • 举报
回复
引用 5 楼 shijing266 的回复:
[quote=引用 4 楼 chanryma 的回复:] @shijing266 没有乱码。我之前请求用的是URLConnection connection = realUrl.openConnection(); 换成了apach的DefaulHttpClient。
你的意思是换个请求方式,返回参数不变,还是json格式,但是解析可以通过了?[/quote] 是的。只是客户端这边改了一下请求的方式和解析的方式。 不好意思的是,我再用之前的请求方式去重现、做个总结的时候,之前的也工作正常了。这让我很郁闷。 我之前发请求的方式用的是这个连接下的: http://www.cnblogs.com/zhuawang/archive/2012/12/08/2809380.html 只是把sendGet方法里将参数拼到url里的过程做了个如下判断:
            if (!StringUtils.isEmptyOrWhitespaceOnly(param)) {
                url = url + "?" + param;
            }
在这里一起感谢各位为我花费的时间。
  • 打赏
  • 举报
回复
换种请求方式? 哪种? 你出问题的地方,json数据是不是出现乱码了
chanryma 2015-11-06
  • 打赏
  • 举报
回复
换了种请求的方式。正常了。稍后详细描述一下。 不过还是解释不了为什么之前的方式在Eclipse中直接运行可以,打到jar里就不行。
  • 打赏
  • 举报
回复
引用 8 楼 rui888 的回复:
先转码后面再转回来。 fastjson 效率很高。
就是我拿到的json数据也够大的,然后logger输出直接变"?"号了, 但是直接用json工具格式化,就能清楚的辨别开来,显示正常 就是直接用fastjson转就出错了,其他转换都正常,出现这种带html标签就有问题
tony4geek 2015-11-06
  • 打赏
  • 举报
回复
引用 7 楼 shijing266 的回复:
先转码后面再转回来。 fastjson 效率很高。
  • 打赏
  • 举报
回复
引用 6 楼 rui888 的回复:
fastjson 试试呢。有可能是gson 的bug 。 编码转换试一试呢。 其次如果是实体的话,你循环测试全部一样的实体,然后足够的大到1005741 再试试。
fastjson对特定字符无法转换,我之前遇到过一次,对于某些html标签作为json的value的时候,转换就会失败
tony4geek 2015-11-06
  • 打赏
  • 举报
回复
fastjson 试试呢。有可能是gson 的bug 。 编码转换试一试呢。 其次如果是实体的话,你循环测试全部一样的实体,然后足够的大到1005741 再试试。
  • 打赏
  • 举报
回复
引用 4 楼 chanryma 的回复:
@shijing266 没有乱码。我之前请求用的是URLConnection connection = realUrl.openConnection(); 换成了apach的DefaulHttpClient。
你的意思是换个请求方式,返回参数不变,还是json格式,但是解析可以通过了?
chanryma 2015-11-06
  • 打赏
  • 举报
回复
@shijing266 没有乱码。我之前请求用的是URLConnection connection = realUrl.openConnection(); 换成了apach的DefaulHttpClient。
chanryma 2015-11-05
  • 打赏
  • 举报
回复
参考过的帖子: http://m.blog.csdn.net/blog/Aaren_Jiang/12849777 http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece76310579135480ddd276b97844b22918448e435061e5a25a4ec66644b598f8461640ba54957ecfa376f665067f6cc9e9f4aabebd93f2ffe76692f0b8637478e44fa951132c156c51bb4f30ee7ccb174d3f9818cc8542595005b2eddb0d40d564c8b32ac437bb2f1db0e4e024caea86d25a9562268c27f57b636a7bd6e3b1081879c1a0c9876857611e6f066ee6a4ff54cf349436519fc1bfb59462740b70d61e8454d5fcfb7&p=8b2a971e948259eb08e2947d07578b&newp=9f57c64ad4db18fa08e2947d075e8e231610db2151d7da0d2681&user=baidu&fm=sc&query=gson+long+string+MalformedJsonException+site%3Astackoverflow%2Ecom&qid=895b7da800000ba9&p1=5 http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece76310579135480ddd276b97844b22918448e435061e5a25a4ec66644b598f84616703aa4c56ecfb336f62427deb8cc8fe0c87fbcf6d6e9f27422f4fd8154f9346f89d1e649c7cc710b8f85ba1e1ad6e84aea480830244ca25583cdaa7cb4d00629d25a14373a5fdc414544b55e7ad666aaa182a75882331e81aa5b5256e76c0b09d0710963dd0104ec4f161ed7e4de245fc5e467813ea1da609217172a658268f1f6058&p=8d66e75f8a904ead4ebd9b7e0e1d94&newp=81769a4784934eaf5be6c9624d5497231610db2151d2db47&user=baidu&fm=sc&query=gson+long+string+MalformedJsonException+site%3Astackoverflow%2Ecom&qid=895b7da800000ba9&p1=1 http://www.itstrike.cn/Question/7566af9d-eb87-4ade-b64c-2ab8333599e8.html
包含以下java源文件: com.google.gson.DefaultDateTypeAdapter.class com.google.gson.ExclusionStrategy.class com.google.gson.FieldAttributes.class com.google.gson.FieldNamingPolicy.class com.google.gson.FieldNamingStrategy.class com.google.gson.Gson.class com.google.gson.GsonBuilder.class com.google.gson.InstanceCreator.class com.google.gson.JsonArray.class com.google.gson.JsonDeserializationContext.class com.google.gson.JsonDeserializer.class com.google.gson.JsonElement.class com.google.gson.JsonIOException.class com.google.gson.JsonNull.class com.google.gson.JsonObject.class com.google.gson.JsonParseException.class com.google.gson.JsonParser.class com.google.gson.JsonPrimitive.class com.google.gson.JsonSerializationContext.class com.google.gson.JsonSerializer.class com.google.gson.JsonStreamParser.class com.google.gson.JsonSyntaxException.class com.google.gson.LongSerializationPolicy.class com.google.gson.TreeTypeAdapter.class com.google.gson.TypeAdapter.class com.google.gson.TypeAdapterFactory.class com.google.gson.annotations.Expose.class com.google.gson.annotations.SerializedName.class com.google.gson.annotations.Since.class com.google.gson.annotations.Until.class com.google.gson.internal.ConstructorConstructor.class com.google.gson.internal.Excluder.class com.google.gson.internal.JsonReaderInternalAccess.class com.google.gson.internal.LazilyParsedNumber.class com.google.gson.internal.LinkedTreeMap.class com.google.gson.internal.ObjectConstructor.class com.google.gson.internal.Primitives.class com.google.gson.internal.Streams.class com.google.gson.internal.UnsafeAllocator.class com.google.gson.internal.bind.ArrayTypeAdapter.class com.google.gson.internal.bind.CollectionTypeAdapterFactory.class com.google.gson.internal.bind.DateTypeAdapter.class com.google.gson.internal.bind.JsonTreeReader.class com.google.gson.internal.bind.JsonTreeWriter.class com.google.gson.internal.bind.MapTypeAdapterFactory.class com.google.gson.internal.bind.ObjectTypeAdapter.class com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.class com.google.gson.internal.bind.SqlDateTypeAdapter.class com.google.gson.internal.bind.TimeTypeAdapter.class com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.class com.google.gson.internal.bind.TypeAdapters.class com.google.gson.reflect.TypeToken.class com.google.gson.stream.JsonReader.class com.google.gson.stream.JsonScope.class com.google.gson.stream.JsonToken.class com.google.gson.stream.JsonWriter.class com.google.gson.stream.MalformedJsonException.class
java 工具包, async-http-client-1.6.3.jar com.google.gson.DefaultDateTypeAdapter.class com.google.gson.ExclusionStrategy.class com.google.gson.FieldAttributes.class com.google.gson.FieldNamingPolicy.class com.google.gson.FieldNamingStrategy.class com.google.gson.Gson.class com.google.gson.GsonBuilder.class com.google.gson.InstanceCreator.class com.google.gson.JsonArray.class com.google.gson.JsonDeserializationContext.class com.google.gson.JsonDeserializer.class com.google.gson.JsonElement.class com.google.gson.JsonIOException.class com.google.gson.JsonNull.class com.google.gson.JsonObject.class com.google.gson.JsonParseException.class com.google.gson.JsonParser.class com.google.gson.JsonPrimitive.class com.google.gson.JsonSerializationContext.class com.google.gson.JsonSerializer.class com.google.gson.JsonStreamParser.class com.google.gson.JsonSyntaxException.class com.google.gson.LongSerializationPolicy.class com.google.gson.TreeTypeAdapter.class com.google.gson.TypeAdapter.class com.google.gson.TypeAdapterFactory.class com.google.gson.annotations.Expose.class com.google.gson.annotations.SerializedName.class com.google.gson.annotations.Since.class com.google.gson.annotations.Until.class com.google.gson.internal.ConstructorConstructor.class com.google.gson.internal.Excluder.class com.google.gson.internal.JsonReaderInternalAccess.class com.google.gson.internal.LazilyParsedNumber.class com.google.gson.internal.ObjectConstructor.class com.google.gson.internal.Primitives.class com.google.gson.internal.Streams.class com.google.gson.internal.StringMap.class com.google.gson.internal.UnsafeAllocator.class com.google.gson.internal.bind.ArrayTypeAdapter.class com.google.gson.internal.bind.CollectionTypeAdapterFactory.class com.google.gson.internal.bind.DateTypeAdapter.class com.google.gson.internal.bind.JsonTreeReader.class com.google.gson.internal.bind.JsonTreeWriter.class com.google.gson.internal.bind.MapTypeAdapterFactory.class com.google.gson.internal.bind.ObjectTypeAdapter.c

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧