私はこのようなことをやろうとしていますが、それはうまくいきません:
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)
で、配列を返します。ここでも基本的に同じものが必要です。
次のようなコードがあります。
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
を試してください。これが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));
警告はライブラリ(またはユーティリティメソッド)ではなくコンパイラによって行われます。
Jacksonを直接使用する最も簡単な方法は次のとおりです。
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に子オブジェクトがあると(これはwill)失敗しますが(これは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);
}
}
いつか誰かがMapのKey/value型に変換するutilメソッドを作成することを考えているのでこの答え:)
ここ に記載されているように、GoogleのGsonを使用しないのはなぜですか。
非常に簡単で、私のために仕事をしました:
HashMap<String,String> map = new Gson().fromJson( yourJsonString, new TypeToken<HashMap<String, String>>(){}.getType());