219

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

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

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

しかし、IDE は次のように述べています。

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

これを行う正しい方法は何ですか?私はJacksonのみを使用しています.JSONとの間で変換するネイティブJavaの方法はありますか?

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

4

10 に答える 10

362

[2020 年 9 月の更新] ここでの最初の回答は、何年も前から役立つようで、まだ賛成票を集めていますが、現在は Google の GSON ライブラリを使用しています。これは、より直感的であることがわかりました。

私は次のコードを持っています:

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")); 

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

于 2010-03-26T17:04:41.980 に答える
61

試してみてくださいTypeFactory。Jackson 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);

Jackson JSON の古いバージョンのコードは次のとおりです。

Map<String, String> result = new ObjectMapper().readValue(
    data, TypeFactory.mapType(HashMap.class, String.class, String.class));
于 2010-06-19T17:42:23.180 に答える
29

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

ジャクソンを直接使用する最も簡単な方法は次のとおりです。

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);

呼び出すユーティリティメソッドは、おそらくこれに似たものを実行します。

于 2010-03-26T18:24:48.120 に答える
10

文字列から JSON マップへの変換:

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

ObjectMapper mapper = new ObjectMapper();

map = mapper.readValue(string, HashMap.class);
于 2012-06-28T08:16:58.153 に答える
5
JavaType javaType = objectMapper.getTypeFactory().constructParameterizedType(Map.class, Key.class, Value.class);
Map<Key, Value> map=objectMapper.readValue(jsonStr, javaType);

これで問題が解決すると思います。

于 2015-12-10T06:04:34.690 に答える
4

以下は私にとってはうまくいきます:

Map<String, String> propertyMap = getJsonAsMap(json);

wheregetJsonAsMapは次のように定義されます。

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"
}
于 2015-12-21T20:09:31.253 に答える
2

Google の Gson の使用

hereに記載されているように、Google の Gson を使用しないのはなぜですか?

非常に簡単で、私のために仕事をしました:

HashMap<String,String> map = new Gson().fromJson( yourJsonString, new TypeToken<HashMap<String, String>>(){}.getType());
于 2016-10-28T10:18:27.090 に答える