【问题标题】:How to find JsonParse exception in json如何在 json 中找到 JsonParse 异常
【发布时间】:2016-01-28 22:55:40
【问题描述】:

我正在尝试解析以下 json。这必须给我一个错误,说不正确的 json 格式。但是解析器只解析 json 直到 "value:15" 并且没有抛出任何异常。我怎样才能做到这一点?

String json = { and : [{key: domain, value: cricket}, {key : STAT_CDE,value : 15}]}, { and : [{key: domain, value: football}, {key : STAT_CDE,value : 10}]}

我正在使用的示例代码:

import org.codehaus.jackson.map.ObjectMapper;

ObjectMapper mapper = new ObjectMapper();
mapper.readTree(json); //this line is not throwing me any exception

这里是sn-p的代码:

import org.codehaus.jackson.map.ObjectMapper;

public class JsonTestParse {
    public static void main(String[] args) {
        String json = "{ \"and\" : [{\"key\": \"domain\", \"op\": \"=\", \"value\": \"cricket\"}, {\"key\" : \"STAT_CDE\",\"op\" : \"=\",\"value\" : \"13\"}]},"+
                "{ \"and\" : [{\"key\": \"domain\", \"op\": \"=\", \"value\": \"Football\"}, {\"key\" : \"STAT_CDE\",\"op\" : \"=\",\"value\" : \"10\"}]}";

        System.out.println("json: " + json);

        ObjectMapper mapper = new ObjectMapper();
        try {
            mapper.readTree(json);
        } catch (Exception e) {
            System.out.println("object mapper exp");

        }
        System.out.println("mapper complete");

    }

}

还有输出:

第 1 行:json: { "and" : [{"key": "domain", "op": "=", "value": "cricket"}, {"key" : "STAT_CDE"," op" : "=","value" : "13"}]},{ "and" : [{"key": "domain", "op": "=", "value": "Football"}, {"key" : "STAT_CDE","op" : "=","value" : "10"}]} 第 2 行:映射器完成

【问题讨论】:

  • 这不是 JSON,JSON 是一个字符串,你应该双引号属性名称
  • 好的。这是我使用的 java json 字符串: { \"and\" : [{\"key\": \"domain\", \"op\": \"=\", \"value\": \ "cricket\"}, {\"key\" : \"STAT_CDE\",\"op\" : \"=\",\"value\" : \"15\"}]},{ \"and \" : [{\"key\": \"domain\", \"op\": \"=\", \"value\": \"football\"}, {\"key\" : \ "STAT_CDE\",\"op\" : \"=\",\"value\" : \"10\"}]}

标签: json parsing objectmapper


【解决方案1】:

问题是那个json格式没有问题!从语法上讲,您将逗号分隔的列表分配给 json,这是完全有效的代码 - 它将 json 设置为列表中的第一项,而不对其余值执行任何操作。

代码执行后,json 如下所示:

String json = { and : [{key: domain, value: cricket}, {key : STAT_CDE,value : 15}]}

而且这个值已经被完全忽略了:

{ and : [{key: domain, value: football}, {key : STAT_CDE,value : 10}]}

如您所见,json 结构完美。

此外,您似乎期望的是 String 对象,但您提供的是地图。

尝试以下方法:

String json = "{ and : [{key: domain, value: cricket}, {key : STAT_CDE,value : 15}]}, { and : [{key: domain, value: football}, {key : STAT_CDE,value : 10}]}"

然后解析json。这肯定会失败,因为键没有用双引号(" 字符)括起来,这是 json 格式的要求。

编辑

要及时了解问题:

这是您说您正在使用的 json 的格式化视图:

{ 
    "and" : [
        {"key": "domain", "op": "=", "value": "cricket"}, 
        {"key" : "STAT_CDE","op" : "=","value" : "15"}
    ]
},
{
    "and" : [
        {"key": "domain", "op": "=", "value": "football"},
        {"key" : "STAT_CDE","op" : "=","value" : "10"}
    ]
}

问题在于这不是一个 json 对象 - 它是两个单独的 json 对象,每个对象都是格式正确的。我猜ObjectMapper 会解析一个完整的 json 结构,并忽略任何尾随数据而不会引发错误。

如果您想在 json 中捕获整个结构,您需要将它们封装在一起,可能使用数组:

[
    { 
        "and" : [
            {"key": "domain", "op": "=", "value": "cricket"}, 
            {"key" : "STAT_CDE","op" : "=","value" : "15"}
        ]
    },
    {
        "and" : [
            {"key": "domain", "op": "=", "value": "football"},
            {"key" : "STAT_CDE","op" : "=","value" : "10"}
        ]
    }
]

【讨论】:

  • 抱歉分享已编辑的字符串。这是我提供给字符串的整个字符串。 ObjectMapper 仍然没有抛出异常。我在网上验证了这一点,我看到了错误。字符串是 "{\"and\" : [{\"key\": \"domain\", \"op\": \"=\", \"value\": \"cricket\"}, {\"key\" : \"STAT_CDE\",\"op\" : \"=\",\"value\" : \"15\"}]},{ \"and\" : [{\ "key\": \"domain\", \"op\": \"=\", \"value\": \"football\"}, {\"key\" : \"STAT_CDE\",\ "op\" : \"=\",\"value\" : \"10\"}]}"
猜你喜欢
  • 2014-07-26
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 2013-05-24
  • 1970-01-01
  • 2018-10-28
相关资源
最近更新 更多