杰克逊杰森解析错误

时间:2016-09-05 11:43:02

标签: java json parsing jackson

您好我正在研究一些遗留代码,JSON模型的结构发生了一些变化 原始模型

{
"values": {
    "business": {
        "default": 5.2
    },
    "personal": {
        "charity": 0.728,
        "medical": 1.222,
        "moving": 1.222
    }
}
}

新模型是这样的

{
"_values": {
    "business": {
        "purpose": {
            "default": 5.2
        },
        "vehicle": {
            "automobile": 0.0,
            "bicycle": 0.0,
            "motorcycle": 0.0
        }
    },
    "personal": {
        "purpose": {
            "charity": 0.7280000000000001,
            "medical": 1.222,
            "moving": 1.222
        }
    }
}
}

所以我们使用的是更快的xml.jackson,我是一个非常新的,经过几次尝试不同的方法后,我不断收到错误信息

com.fasterxml.jackson.databind.JsonMappingException:无法反序列化START_OBJECT令牌的双重实例                      at [来源:java.io.InputStreamReader@6b8b2b1; line:42,column:11](通过引用链:> service.api.types.Drive_Json [“_ values”] - > service.api.types.PotentialValues [“business”] - > java.util.HashMap [ “目的”])

我使用以下注释来提取我的Json文件中的映射

@JsonProperty("values")
private values values;

@JsonIgnoreProperties(ignoreUnknown = true)
public class values {
    public HashMap<String, Double> purpose;
    public HashMap<String, Double> personal;
}

当前现有值文件有两个hashmap来保存“personal”&amp;的值。 “business”并且没有明确的绑定将模型和存储放在相应的hashmap中。

我将json文件中的JsonProperty字段更改为“_value”,并尝试更改值类文件但我不断得到映射错误,任何人都可以帮助我创建值类的正确模型。 我尝试了一个hashmap,但不知道如何映射它们。

@JsonProperty("_values") 
private values Values; 

@JsonIgnoreProperties(ignoreUnknown = true)
public class values {
public HashMap<String, Double> business_purpose;
public HashMap<String, Double> business_vehicle;
public HashMap<String, Double> personal_purpose;
};

2 个答案:

答案 0 :(得分:3)

您可以使用几种不同的方法将JSON解析为Java对象。在下面找到其中两个(但是请注意,还有许多其他人可以考虑):

方法1

您应该使用@JsonProperty("_values")代替@JsonProperty("values")来匹配新的JSON。所以你的模型类将如下:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Values {

    private Map<String, Object> business;
    private Map<String, Object> personal;

    // Getters and setters omitted
}
public class Data {

    @JsonProperty("_values")
    private Values values;

    // Getters and setters omitted
}

要解析它,您可以使用:

String json = "{\"_values\":{\"business\":{\"purpose\":{\"default\":5.2},\"vehicle\":"
            + "{\"automobile\":0.0,\"bicycle\":0.0,\"motorcycle\":0.0}},\"personal\":"
            + "{\"purpose\":{\"charity\":0.728,\"medical\":1.222,\"moving\":1.222}}}}";

ObjectMapper mapper = new ObjectMapper();
Data data = mapper.readValue(json, Data.class);

方法2

或者,您可以将JSON字符串解析为Map<String, Object>。可以通过以下方式实现:

String json = "{\"_values\":{\"business\":{\"purpose\":{\"default\":5.2},\"vehicle\":"
            + "{\"automobile\":0.0,\"bicycle\":0.0,\"motorcycle\":0.0}},\"personal\":"
            + "{\"purpose\":{\"charity\":0.728,\"medical\":1.222,\"moving\":1.222}}}}";

ObjectMapper mapper = new ObjectMapper();
Map<String, Object> values = mapper.readValue(json, 
                                    new TypeReference<HashMap<String, Object>>() {});

答案 1 :(得分:-1)

要以String形式发送响应,请在java pojo中的java属性中使用注解。 例如: @JsonFormat(shape = JsonFormat.Shape.STRING) 受保护的Long userId;