programing

JSONObject를 맵으로 변환

codeshow 2023. 2. 26. 10:21
반응형

JSONObject를 맵으로 변환

나는 가지고 있다JSONObject변환하고 싶은 Atribute가 있습니다.Map<String, Object>

json.org 또는 에서 사용할 수 있는 것이 있습니까?ObjectMapper?

잭슨 사용에 문제가 있는 경우 Gson() (com.google.gson) 라이브러리를 사용할 수 있습니다.

//Martin Meeser가 제안한 대로 JsonObject.toString()을 JsonObject로 변경했습니다.

HashMap<String, Object> yourHashMap = new Gson().fromJson(yourJsonObject, HashMap.class);

Jackson ( http://json.org/ )를 사용합니다.

HashMap<String,Object> result =
       new ObjectMapper().readValue(<JSON_OBJECT>, HashMap.class);

이것이 나에게 효과가 있었다.

    public static Map<String, Object> toMap(JSONObject jsonobj)  throws JSONException {
        Map<String, Object> map = new HashMap<String, Object>();
        Iterator<String> keys = jsonobj.keys();
        while(keys.hasNext()) {
            String key = keys.next();
            Object value = jsonobj.get(key);
            if (value instanceof JSONArray) {
                value = toList((JSONArray) value);
            } else if (value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }   
            map.put(key, value);
        }   return map;
    }

    public static List<Object> toList(JSONArray array) throws JSONException {
        List<Object> list = new ArrayList<Object>();
        for(int i = 0; i < array.length(); i++) {
            Object value = array.get(i);
            if (value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }
            else if (value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            list.add(value);
        }   return list;
}

이 질문의 대부분은 다음과 같습니다.반복자 Java를 사용하여 모든 키에 대해 JSONObject를 새 Map으로 변환하는 방법

변환하는 가장 좋은 방법HashMap<String, Object>이것은 다음과 같습니다.

HashMap<String, Object> result = new ObjectMapper().readValue(jsonString, new TypeReference<Map<String, Object>>(){}));

위 솔루션에 대한 주의사항(A Paul에서):이 솔루션은 HashMap < String, Object >를 재구축하지 않기 때문에 동작하지 않습니다.대신 HashMap < String, LinkedHashMap >을 만듭니다.

그 이유는 경계시 각 오브젝트(LinkedHashMap으로 마샬링된 JSON)가 그대로 사용되며 LinkedHashMap이 (LinkedHashMap을 적절한 오브젝트로 변환하는 것이 아니라)1 대 1로 사용되기 때문입니다.

HashMap < String, MyOwnObject > 를 사용하고 있는 경우는, 적절한 분계 처리를 실시할 수 있었습니다.다음의 예를 참조해 주세요.

ObjectMapper mapper = new ObjectMapper();
TypeFactory typeFactory = mapper.getTypeFactory();
MapType mapType = typeFactory.constructMapType(HashMap.class, String.class, MyOwnObject.class);
HashMap<String, MyOwnObject> map = mapper.readValue(new StringReader(hashTable.toString()), mapType);

JSONObject를 반환하는 메서드가 있습니다.Map<String,Object>.

에서 사용되는 Maven 의존관계pom.xml:

<dependency>
  <groupId>org.json</groupId>
  <artifactId>json</artifactId>
  <version>current-version</version>
</dependency>

를 찾을 수 있습니다.current-version 여기 있습니다.

이러한 문제를 해결할 수 있는 방법은

ObjectMapper#convertValue(Object fromValue, Class<T> toValueType)

그 결과, 원래의 큐에스티온은 2단계 변환으로 해결할 수 있습니다.

  1. JSON을 오브젝트로 돌려보내야 합니다.Map<String, Object>로서 구분된다.HashMap<String, LinkedHashMap>bjectMapper#readValue()를 사용합니다.

  2. 내부 LinkedHashMaps를 올바른 개체로 다시 변환합니다.

ObjectMapper mapper = new ObjectMapper(); Class clazz = (Class) Class.forName(classType); MyOwnObject value = mapper.convertValue(value, clazz);

'클래스'를 방지하려면Type'은 미리 알고 있어야 한다, 나는 mashalling 중에 다음을 포함하는 추가 맵이 추가되었다.<key, classNameString>짝짓기. 그래서 놀라운 시간에, 학급은유형을 동적으로 추출할 수 있습니다.

코틀린에서는 이렇게 했어요.

mutableMapOf<String, Any>().apply {
           jsonObj.keys().forEach { put(it, jsonObj[it]) }
       }
import com.alibaba.fastjson.JSONObject;


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

JSONObject rec = JSONObject.parseObject(<JSONString>);

map.put(rec.get("code").toString(), rec.get("value").toString());

언급URL : https://stackoverflow.com/questions/21544973/convert-jsonobject-to-map

반응형