ジャクソンAPIを使用してのLinkedHashMap <文字列、文字列>にJSONレコードを変換します

ゼウス:

私はそれがオブジェクトによってオブジェクトを読み取るためにしようとしています(それがJSONオブジェクトの配列が含まれています。)JSONファイルを持っています。各オブジェクト私はAに変換する必要がありLinkedHashMap<String,String>、キーと値の両方が文字列です。JSONオブジェクトは文字列以外の値を(含まれている場合でもこと注Integer/Boolean)、私は自分のしたいLinkedHashMap文字列を格納します。

これは、(私のJSONファイルですfilms.json):

[
  {
    "name": "Fight Club",
    "year": 1999,
  }
]

さて、これは1つの目的としています。私はそれを変換したいですLinkedHashMap<String,String>

したがって、上記の例のために、私はLinkedHashMap(第一JSONオブジェクト用)を含める必要があります。

「名前」:「ファイト・クラブ」

"年": "1999"

今年はどのように注意してくださいStringLinkedHashMapはありませんInteger

これは私が試したものです。

Map<String, Object> myLinkedHashMap;

JsonParser jsonParser = new JsonFactory().createParser(new File("films.json"));
jsonParser = new JsonFactory().createParser(new File(filePath));
jsonParser.nextToken();

ObjectMapper  mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

while(jsonParser.nextToken() != JsonToken.END_ARRAY){
    myLinkedHashMap  = mapper.readValue(jsonParser, LinkedHashMap.class);
}

変数は、myLinkedHashMap私のJSONファイル内のオブジェクトのキー/値のペアが含まれます。

しかし、問題は、JSONファイルの「年」のため、私はJSONファイルなどのLinkedHashMapの整数を取得していますがまた整数が含まれていることです。

代わりに、私が欲しいIntegerStringの中でLinkedHashMap

私が得る助けてくださいStringLinkedHashMapはなく、Integer

注:解決策は、他のデータ型にジェネリックにする必要があります。

JSONオブジェクトがブール含まれているのであればtrue、その後、私がLinkedHashMap含まれている必要があります"true"

マイケルZiober:

あなたは使用してマップタイプを構築することができますTypeFactoryし、constructMapTypeあなたから必要なんまさに伝えるための方法readValueの方法。たとえば以下を参照してください。

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.MapType;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.util.Assert;

import java.io.File;
import java.util.LinkedHashMap;

public class JsonMapApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());
        mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        JsonParser jsonParser = mapper.getFactory().createParser(jsonFile);
        jsonParser.nextToken();

        MapType mapType = mapper.getTypeFactory().constructMapType(LinkedHashMap.class, String.class, String.class);
        while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
            LinkedHashMap<String, String> map = mapper.readValue(jsonParser, mapType);
            map.forEach((k, v) -> {
                Assert.isInstanceOf(String.class, v);
                System.out.println(k + " -> " + v + " (" + v.getClass().getName() + ")");
            });
        }
    }
}

上記のコードを印刷:

name -> Fight Club (java.lang.String)
year -> 1999 (java.lang.String)

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=330632&siteId=1