JSON 문자열을 맵으로 변환하는 방법 Jackson JSON으로
나는 이런 식으로하려고하지만 작동하지 않습니다 :
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);
}
파일에서 읽는 중이지만 a 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에서 하위 개체가있는 경우 실패 (그들이하지이기 때문에 String
, 그들은 또 다른이야 HashMap
)하지만 JSON 지금과 같은 속성의 키 값 목록이있는 경우 작동합니다 :
{
"client_id": "my super id",
"exp": 1481918304,
"iat": "1450382274",
"url": "http://www.example.com"
}
Google의 Gson 사용
여기에 언급 된 것처럼 Google의 Gson을 사용하지 않는 이유는 무엇 입니까?
매우 직설적이고 나를 위해 일했습니다.
HashMap<String,String> map = new Gson().fromJson( yourJsonString, new TypeToken<HashMap<String, String>>(){}.getType());
Here is the generic solution to this problem.
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);
}
}
Hope someday somebody would think to create a util method to convert to any Key/value type of Map hence this answer :)
'Programing' 카테고리의 다른 글
Jenkinsfile (groovy)에서 변수로 쉘 명령의 출력을 얻는 방법은 무엇입니까? (0) | 2020.05.24 |
---|---|
Swift의 NSString에서 NSData 생성 (0) | 2020.05.24 |
jQuery를 사용하여 두 번째 자식 얻기 (0) | 2020.05.24 |
메인 스크롤바를 항상 보이게 만들기 (0) | 2020.05.24 |
폴스 루로 케이스 전환? (0) | 2020.05.24 |