alibaba / fastjson

FASTJSON 2.0.x has been released, faster and more secure, recommend you upgrade.
https://github.com/alibaba/fastjson2/wiki/fastjson_1_upgrade_cn
Apache License 2.0
25.74k stars 6.5k forks source link

解析这样的json数据会报错 #795

Open QweikChris opened 8 years ago

QweikChris commented 8 years ago

{\"error_code\": 0,\"reason\": \"Success\",\"result\": {\"data\":{ \"holiday\" : \"{\"name\":\"端午节\",\"festival\":\"2016-6-9\",\"desc\":\"6月9日至11日放假调休,共3天。6月12日(星期日)上班。\",\"list\":[{\"date\":\"2016-6-9\",\"status\":\"1\"},{\"date\":\"2016-6-10\",\"status\":\"1\"},{\"date\":\"2016-6-11\",\"status\":\"1\"},{\"date\":\"2016-6-12\",\"status\":\"2\"}]}\" , \"year\" : \"2016\" , \"year-month\" : \"2016-7\"}}}

com.alibaba.fastjson.JSONException: syntax error, position at 55, name holiday at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:479) at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:425) at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:425) at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1183) at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1152) at com.alibaba.fastjson.JSON.parse(JSON.java:101) at com.alibaba.fastjson.JSON.parse(JSON.java:92) at com.ch.test.TestJson.t1(TestJson.java:14) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

githublaohu commented 8 years ago

\"{\"name\ }]}\"

多了一个双引号,不符合 json的语法规则。如果你去掉这对 双引号,就可以了。 这样的问题,真心难找。

imliujun commented 8 years ago

{ "code": "200", "msg": "操作成功", "token": "", "data": { "accept_push": 1, "items": [ { "relation_id": 12462, "nickname": "29", "gender": 0, "grade": 7, "signature": "", "photo": "http://heixiucrm-test.oss-cn-beijing.aliyuncs.com/robot/1460705770811", "accept_push": 1 }, { "relation_id": 12463, "nickname": "哦1哦1哦1逆袭why", "gender": 0, "grade": 54, "signature": "", "photo": "http://heixiu.oss-cn-beijing.aliyuncs.com/1226_head_20160831020021", "accept_push": 1 }, { "relation_id": 12367, "nickname": "去吧🤔", "gender": 0, "grade": 50, "signature": "", "photo": "http://heixiu.oss-cn-beijing.aliyuncs.com/test_1269_head_20160824154244", "accept_push": 1 }, { "relation_id": 12488, "nickname": "急急如律令", "gender": 0, "grade": 52, "signature": "", "photo": "http://heixiu.oss-cn-beijing.aliyuncs.com/heixiu1396_1471940861545", "accept_push": 1 }, { "relation_id": 12489, "nickname": "每天正能量~誉", "gender": 0, "grade": 37, "signature": "工具了家里", "photo": "http://heixiu.oss-cn-beijing.aliyuncs.com/heixiu1628_1471601607282", "accept_push": 1 }, { "relation_id": 12368, "nickname": "拳怕少壮", "gender": 0, "grade": 56, "signature": "无限制", "photo": "http://heixiu.oss-cn-beijing.aliyuncs.com/heixiu1914_1472523618816", "accept_push": 1 }, { "relation_id": 12365, "nickname": "666", "gender": 0, "grade": 58, "signature": "", "photo": "http://heixiu.oss-cn-beijing.aliyuncs.com/heixiu2440_1471941930217", "accept_push": 1 } ] } }

这个json格式是合法的。

public class HttpResult<T> {

    public String code;
    public String msg;
    public String token;

    public T data;
}

public class RecommendBean {
    public int accept_push;
    public List<ItemsBean> items;

    public static class ItemsBean {
        public int relation_id;
        public int gender;
        public int empiric;
        public String signature;
        public String photo;
        public int accept_push;
        public int user_id;
        public String nickname;//昵称
    }
}

上面那串JSON解析成 HttpResult<RecommendBean>,data属性变为了JsonObject,data没有解析成RecommendBean对象


{"code":"200","msg":"","token":"","data":{"liveList":[],"replayList":[]}}

public class LiveAttentionInfo {
    public List<LiveList> liveList;
    public List<ReplayList> replayList;
}

这一串JSON的data解析HttpResult<LiveAttentionInfo> 同样没有解析成泛型。

compile 'com.alibaba:fastjson:1.1.54.android'

解析方法

JSON.parseObject(jsonString, mType, config, featureValues, features != null ? features : EMPTY_SERIALIZER_FEATURES);

@wenshao