Как преобразовать строку JSON в карту с помощью Jackson JSON
Я пытаюсь сделать что-то вроде этого, но это не работает:
Map<String, String> propertyMap = new HashMap<String, String>();
propertyMap = JacksonUtils.fromJSON(properties, Map.class);
но IDE говорит:
непроверенное задание
Map to Map<String,String>
Как правильно это сделать?
Я использую только Jackson, потому что это то, что уже доступно в проекте, есть ли собственный способ преобразования Java в/из JSON?
в PHP я бы просто json_decode($str) и я бы вернул массив. Мне нужно в основном то же самое здесь.
9 ответов:
у меня есть следующий код:
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));
предупреждение, которое вы получаете, выполняется компилятором, а не библиотекой (или служебным методом).
самый простой способ использовать Джексона напрямую будет:
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" }
С помощью Google Gson
почему бы не использовать Gson Google, как указано в здесь?
очень прямо вперед, и сделал работу за меня:
HashMap<String,String> map = new Gson().fromJson( yourJsonString, new TypeToken<HashMap<String, String>>(){}.getType());
вот общее решение этой проблемы.
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 для преобразования в любой тип ключа/Значения карты, следовательно, этот ответ :)
Comments