【问题标题】:Parsing JSON in java: Malformed JSON: Unexpected 'C'在 Java 中解析 JSON:格式错误的 JSON:意外的“C”
【发布时间】:2016-05-30 11:47:43
【问题描述】:

早安,

我正在用 java 解析一些 JSON(来自 cisco CMX 系统的通知)。我已经解析了很多 JSON,但是这个拒绝被解析。我尝试了几种方法:具有宽松模式的阅读器、普通 gson 等。

根据 jsonlint,我解析的 JSON 是有效的,这让我相信这是解析器的问题,或者可能是一些我无法清除的隐藏字符。这是我收到的 JSON:

{
"startTime": "08:00",
"previousEndDate": null,
"startDate": "2016-02-17",
"title": "Visitors",
"executionTime": 29,
"value": {
    "primary": {
        "title": "TotalVisitors",
        "value": 16,
        "peakValue": 0,
        "breakdown": [{
            "title": "RepeatVisitors",
            "value": 11
        }, {
            "title": "NewVisitors",
            "value": 5
        }]
    },
    "average": {
        "title": "TotalVisitors",
        "value": 19,
        "peakValue": 0,
        "breakdown": [{
            "title": "RepeatVisitors",
            "value": 15
        }, {
            "title": "NewVisitors",
            "value": 4
        }]
    },
    "previousTimeRange": {
        "title": "TotalVisitors",
        "value": 23,
        "peakValue": 0,
        "breakdown": [{
            "title": "RepeatVisitors",
            "value": 19
        }, {
            "title": "NewVisitors",
            "value": 4
        }]
    }
},
"areas": [{
    "id": 20,
    "name": "CineCitta"
}],
"previousStartDate": "2016-02-16",
"endDate": null,
"endTime": "09:29"
}

这对我来说似乎有效,并且我尝试将其解析为的对象具有正确的字段。 我已经尝试过滤掉 \r \t \n \0 以及它们之间的一些组合。

我目前在java中的代码是:

    String result = "{\"startTime\":\"08:00\",\"previousEndDate\":null,\"startDate\":\"2016-02-17\",\"title\":\"Visitors\",\"executionTime\":29,\"value\":{\"primary\":{\"title\":\"TotalVisitors\",\"value\":16,\"peakValue\":0,\"breakdown\":[{\"title\":\"RepeatVisitors\",\"value\":11},{\"title\":\"NewVisitors\",\"value\":5}]},\"average\":{\"title\":\"TotalVisitors\",\"value\":19,\"peakValue\":0,\"breakdown\":[{\"title\":\"RepeatVisitors\",\"value\":15},{\"title\":\"NewVisitors\",\"value\":4}]},\"previousTimeRange\":{\"title\":\"TotalVisitors\",\"value\":23,\"peakValue\":0,\"breakdown\":[{\"title\":\"RepeatVisitors\",\"value\":19},{\"title\":\"NewVisitors\",\"value\":4}]}},\"areas\":[{\"id\":20,\"name\":\"CineCitta\"}],\"previousStartDate\":\"2016-02-16\",\"endDate\":null,\"endTime\":\"09:29\"}";
    JsonReader reader = new JsonReader(new StringReader(result));
    reader.setLenient(true);

    Gson gson = new Gson();
    ClientInfo info = gson.fromJson(reader, ClientInfo.class);

问题是:有谁知道如何调试这样的问题?我可以使用哪些消毒技术?其他解析器?

编辑:根据要求向 clientinfo 提供代码(使用项目 lombok,所有字段都是公开的):

@ToString
@FieldDefaults(level = AccessLevel.PUBLIC)
public class ClientInfo {
    String startTime;
    String previousEndDate;
    String startDate;
    String title;
    Integer executionTime;
    Value value;
    Area [] areas;
    String previousStartDate;
    String endDate;
    String endTime;
}

public class Value {
    public Visitors primary;
    public Visitors average;
    public Visitors previousTimeRange;
}

@FieldDefaults(level = AccessLevel.PUBLIC)
public class Area {
    Integer id;
    String name;
}
@FieldDefaults(level = AccessLevel.PUBLIC)
public class Visitors {

    String title;
    Integer value;
    Integer peakValue;
    Record [] breakdown;
}
public class Record {
    public String title;
    public Integer value;
}

谢谢你,美好的一天

【问题讨论】:

  • 请出示ClientInfo类的代码
  • 其他解析器:有 Moshi(Square 提供)——不过不知道这是否会更好。
  • 我添加了clientinfo的代码和它引用的类

标签: java json parsing gson


【解决方案1】:
String result = "{\"startTime\":\"08:00\",\"previousEndDate\":null,\"startDate\":\"2016-02-17\",\"title\":\"Visitors\",\"executionTime\":29,\"value\":{\"primary\":{\"title\":\"TotalVisitors\",\"value\":16,\"peakValue\":0,\"breakdown\":[{\"title\":\"RepeatVisitors\",\"value\":11},{\"title\":\"NewVisitors\",\"value\":5}]},\"average\":{\"title\":\"TotalVisitors\",\"value\":19,\"peakValue\":0,\"breakdown\":[{\"title\":\"RepeatVisitors\",\"value\":15},{\"title\":\"NewVisitors\",\"value\":4}]},\"previousTimeRange\":{\"title\":\"TotalVisitors\",\"value\":23,\"peakValue\":0,\"breakdown\":[{\"title\":\"RepeatVisitors\",\"value\":19},{\"title\":\"NewVisitors\",\"value\":4}]}},\"areas\":[{\"id\":20,\"name\":\"CineCitta\"}],\"previousStartDate\":\"2016-02-16\",\"endDate\":null,\"endTime\":\"09:29\"}";

Gson gson = new Gson();
JsonParser parser = new JsonParser();
JsonObject jsonObj = parser.parse(result).getAsJsonObject();
ClientInfo info = gson.fromJson( jsonObj , ClientInfo.class);

你可以试试上面的代码。

【讨论】:

  • 结果是一样的
  • @DriesDeRydt : 那你需要检查clientinfo类代码。
【解决方案2】:

我是个笨蛋。

我认为是解析出了问题,但实际上我的服务应该生成一个 JSON,我没有将它作为 json 返回,而是对象本身导致了错误的解析。

因为我非常专注于我正在做的解析,所以我没有意识到错误本身发生在 restful 服务的隐式 json 解析上。

这将教会我在将代码移至安静的客户端之前不要在简单的环境中进行测试。

谢谢和愚蠢的问候,

干燥

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-26
    • 2016-08-09
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多