Jackson JSON を使用して JSON 文字列を Map<String, String> に変換する方法

StackOverflow https://stackoverflow.com/questions/2525042

  •  22-09-2019
  •  | 
  •  

質問

このようなことをしようとしていますが、うまくいきません:

Map<String, String> propertyMap = new HashMap<String, String>();

propertyMap = JacksonUtils.fromJSON(properties, Map.class);

しかし、IDE は次のように言います。

未チェックの割り当て Map to Map<String,String>

これを行う正しい方法は何ですか?Jackson はプロジェクトですでに利用可能なものであるため、Jackson のみを使用しています。JSON との間で変換するネイティブ Java 方法はありますか?

PHP では単純に json_decode($str) そして配列を返します。ここでも基本的に同じものが必要です。

役に立ちましたか?

解決

次のコードがあります:

public void testJackson() throws IOException {  
    ObjectMapper mapper = new ObjectMapper(); 
    File from = new File("albumnList.txt"); 
    TypeReference<HashMap<String,Object>> typeRef 
            = new TypeReference<HashMap<String,Object>>() {};

    HashMap<String,Object> o = mapper.readValue(from, typeRef); 
    System.out.println("Got " + o); 
}   

ファイルからの読み込みですが、 mapper.readValue() も受け付けます InputStream そしてあなたは得ることができます InputStream 以下を使用して文字列から取得します。

new ByteArrayInputStream(astring.getBytes("UTF-8")); 

マッパーについてはもう少し詳しい説明があります。 私のブログ.

他のヒント

TypeFactoryを試してみてください。ここジャクソンJSON(2.8.4)のコードだ。

Map<String, String> result;
ObjectMapper mapper;
TypeFactory factory;
MapType type;

factory = TypeFactory.defaultInstance();
type    = factory.constructMapType(HashMap.class, String.class, String.class);
mapper  = new ObjectMapper();
result  = mapper.readValue(data, type);

ここジャクソンJSONの古いバージョンのためのコードがあります。

Map<String, String> result = new ObjectMapper().readValue(
    data, TypeFactory.mapType(HashMap.class, String.class, String.class));

あなたはコンパイラによってではなく、ライブラリ(またはユーティリティメソッド)によって行われます警告ます。

最も簡単な方法は、直接ジャクソンを使用すると、次のようになります。

HashMap<String,Object> props;

// src is a File, InputStream, String or such
props = new ObjectMapper().readValue(src, new TypeReference<HashMap<String,Object>>() {});
// or:
props = (HashMap<String,Object>) new ObjectMapper().readValue(src, HashMap.class);
// or even just:
@SuppressWarnings("unchecked") // suppresses typed/untype mismatch warnings, which is harmless
props = new ObjectMapper().readValue(src, HashMap.class);

ユーティリティメソッドは、あなただけのこれに似た何かを、おそらく呼び出します。

ObjectReader reader = new ObjectMapper().readerFor(Map.class);

Map<String, String> map = reader.readValue("{\"foo\":\"val\"}");

readerインスタンスはスレッドセーフであることに注意してください。

JSON地図に文字列からの変換ます:

Map<String,String> map = new HashMap<String,String>();

ObjectMapper mapper = new ObjectMapper();

map = mapper.readValue(string, HashMap.class);
JavaType javaType = objectMapper.getTypeFactory().constructParameterizedType(Map.class, Key.class, Value.class);
Map<Key, Value> map=objectMapper.readValue(jsonStr, javaType);

私は、これはあなたの問題を解決すると思います。

私のために、次の作品ます:

Map<String, String> propertyMap = getJsonAsMap(json);
getJsonAsMapはそうのように定義される

public HashMap<String, String> getJsonAsMap(String json)
{
    try
    {
        ObjectMapper mapper = new ObjectMapper();
        TypeReference<Map<String,String>> typeRef = new TypeReference<Map<String,String>>() {};
        HashMap<String, String> result = mapper.readValue(json, typeRef);

        return result;
    }
    catch (Exception e)
    {
        throw new RuntimeException("Couldnt parse json:" + json, e);
    }
}

注これはのあなたはJSONで子オブジェクトを持っている場合は、の失敗します(彼らはStringじゃないので、彼らは別のHashMapしている)が、あなたのJSONは、キーと値のリストである場合に動作すること

:そうのような性質の
{
    "client_id": "my super id",
    "exp": 1481918304,
    "iat": "1450382274",
    "url": "http://www.example.com"
}

ここでは、この問題に対する一般的な解決策がある。

public static <K extends Object, V extends Object> Map<K, V> getJsonAsMap(String json, K key, V value) {
    try {
      ObjectMapper mapper = new ObjectMapper();
      TypeReference<Map<K, V>> typeRef = new TypeReference<Map<K, V>>() {
      };
      return mapper.readValue(json, typeRef);
    } catch (Exception e) {
      throw new RuntimeException("Couldnt parse json:" + json, e);
    }
  }

希望いつか誰かが故に地図の任意のキー/値の型に変換するには、この答えをutilのメソッドを作成すると思うだろう:)

scroll top