如何检查完整的JSON字符串是否转换成Map

c8ib6hqw  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(269)

我想检查是否完整的JSON字符串被转换为Map在下面的方法。

public boolean isCompleteStringParsedInToJson() {
    boolean isParsed = false;
    String str = "{ \"tierkey 1\": \"Application\", \"tierkey 2\": \"Desktop\", \"tierkey 3\": \"Software\"}, { \"tierkey 4\": \"Application1\", \"tierkey 5\": \"Desktop2\", \"tierkey 6\": \"Software2\"}";
    ObjectMapper mapper = new ObjectMapper();
    
    try {
        Map map = mapper.readValue(str, Map.class);
        //check if complete input string is parsed into Map above. 
        // then set isParsed flag accordingly. 
        
    } catch (JsonProcessingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    return isParsed;
}

在上述情况下,只有“{“tierkey 1”:“应用程序”,“层密钥2”:“桌面”、“层密钥3”:“软件”}”部分作为Map返回。在实际场景中,JSON字符串将输入到方法中。在上述方法中,我只需要确定完整JSON字符串是否解析为Map的情况,然后相应地设置isParsed标志值(true或false)。方法中提到的JSON字符串不是严格的JSON,并且readValue不会因此类JSON字符串而失败。此外,不希望使用DeserializationFeature。FAIL_ON_TRAILING_ObjectMapper上的TOKENS。输入JSON字符串可以手动写入,因此键或值之前可能只有很少的空格。
在mapper.readValue之后应该有什么代码来检查是否完成了对Map的JSON字符串解析?

z31licg0

z31licg01#

如果readValue()行没有抛出异常,这意味着解析成功,您可以将标志设置为true。2在“catch”块中,将标志设置为false。

cx6n0qe3

cx6n0qe32#

问题是您的字符串包含2个单独的JSON。

{"tierkey 1 : "Application", "tierkey 2": "Desktop", "tierkey 3": "Software"}, { "tierkey 4": "Application1", "tierkey 5": "Desktop2", "tierkey 6": "Software2"}

请注意,在键"tierkey 3"之后有一个“}”,它关闭了第一个开头的“{”。因此,当解析Json并到达其结尾时,它将忽略后面的内容。因此,", { "tierkey 4": "Application1",...}"中的部分将被忽略,这是正确的行为。如果要对其进行解析,请将字符串修改为

{"tierkey 1 : "Application", "tierkey 2": "Desktop", "tierkey 3": "Software",  "tierkey 4": "Application1", "tierkey 5": "Desktop2", "tierkey 6": "Software2"}

{{"tierkey 1 : "Application", "tierkey 2": "Desktop", "tierkey 3": "Software"}, { "tierkey 4": "Application1", "tierkey 5": "Desktop2", "tierkey 6": "Software2"}}

相关问题