1. ホーム
  2. java

[解決済み] Jackson Jsonのパースエラー

2022-02-17 03:12:54

質問

こんにちは、私はいくつかのレガシーコードで作業しており、JSONモデルの構造が少し変更されました。 オリジナルモデル

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

新しい Model は次のようなものです。

{
"_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.JsonMappingException: START_OBJECT トークンから double のインスタンスをデシリアライズできません。 at [Source: java.io.InputStreamReader@6b8b2b1; line: 42, column: 11] (through reference chain: >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;
}

現在の既存の値ファイルは、"personal" と "business" の値を保持する2つのハッシュマップを持ち、説明のないバインドでモデルを取得してそれぞれのハッシュマップに格納します。

私は私のjsonファイルのJsonPropertyフィールドを"_value"として変更し、値クラスファイルを変更しようとしたが、私はマッピングエラーが発生し続けることができます誰もが私が値クラスのための正しいモデルを作成する際に助けてください。 私はそれぞれのハッシュマップを試してみましたが、私はそれらをどのようにマッピングするのかよくわかりません。

@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;
};

解決方法は?

JSONをJavaオブジェクトにパースするには、いくつかの異なるアプローチを取ることができます。以下にそのうちの2つを紹介します(ただし、他にも考慮できることはたくさんあることに注意してください)。

アプローチ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>>() {});