【问题标题】:Jackson Json parse errorJackson Json 解析错误
【发布时间】:2016-09-05 11:43:01
【问题描述】:

您好,我正在处理一些遗留代码,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
        }
    }
}
}

所以我们正在使用我很新的fastxml.jackson,在尝试了一些不同的方法后,我不断收到错误消息

com.fasterxml.jackson.databind.JsonMappingException:无法反序列化 START_OBJECT 令牌中的 double 实例 在 [来源:java.io.InputStreamReader@6b8b2b1; line: 42, column: 11](通过引用链:>service.api.types.Drive_Json["_values"]->service.api.types.PotentialValues["business"]->java.util.HashMap[" purpose "])

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

@JsonProperty("values")
private values values;

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

当前现有的值文件有两个哈希图来保存“个人”和“企业”的值,并且没有显式绑定,获取模型并存储在各自的哈希图中。

我将 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;
};

【问题讨论】:

    标签: java json parsing jackson


    【解决方案1】:

    您可以采用几种不同的方法将 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&lt;String, Object&gt;。可以通过以下几行来实现:

    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>>() {});
    

    【讨论】:

    • 嗨,是的,我正在这样做,这就是映射到 hasmap 似乎失败的原因,我在上面的帖子中提到了它
    • @amIT 您在问题中提供的 JSON 无效。试试jsonlint.com
    • opps 我的错误在这里发帖时跳过了括号,json 是有效的,让我添加括号。
    • @amIT 请确保在提问时提供准确的代码。
    • 进行了更改,您能建议我如何进行这项工作吗?
    【解决方案2】:

    要将响应作为字符串发送,请使用 annotiaon 到 java pojo 中的 java 属性。 例子 : @JsonFormat(形状=JsonFormat.Shape.STRING) 受保护的长用户ID;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 2012-07-05
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多