JSONObject nukreipti žemėlapį

Turiu JSONObject su kai kuriais atributais, kuriuos noriu konvertuoti į Map<String, Object>

Ar galiu naudoti su json.org arba ObjectMapper ?

22
04 февр. nustatė Marco Calì 04 vasaris 2014-02-04 08:54 '14 at 8:54 2014-02-04 08:54
@ 4 atsakymai

naudoti „Jackson“ ( http://jackson.codehaus.org/ ) iš http://json.org/

 HashMap<String,Object> result = new ObjectMapper().readValue(<JSON_OBJECT>, HashMap.class); 
13
04 февр. Atsakymą pateikė A Paulius vasario 04 d. 2014-02-04 08:59 '14 at 8:59 2014-02-04 08:59

Atkreipkite dėmesį į aukščiau pateiktą sprendimą (iš A Pauliaus): sprendimas neveikia, nes jis neatkuria HashMap <String, Object> atgal - vietoj to sukuria HashMap <String, LinkedHashMap>.

Priežastis yra ta, kad demarche metu kiekvienas objektas (JSON surūšiuotas kaip „LinkedHashMap“) yra naudojamas, nes užtrunka 1-on-1 „LinkedHashMap“ (vietoj to, kad „LinkedHashMap“ būtų konvertuojamas atgal į atitinkamą objektą).

Jei turite „HashMap“ <String, MyOwnObject>, tada teisinga demarkacija buvo įmanoma - žr. Šį pavyzdį:

 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); 
1
08 мая '14 в 12:48 2014-05-08 12:48 Atsakymą pateikė Stijn V gegužės 8 d. 14 d. 12:48 2014-05-08 12:48

Nustatytos šios problemos gali būti išspręstos naudojant

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

Dėl šios priežasties originalus klausimas gali būti išspręstas dviem etapais:

  • Atšaukite JSON objektą, kuriame Map<String, Object> iššifruojamas kaip HashMap<String, LinkedHashMap> , naudodami bjectMapper # readValue ().

  • Konvertuoti „LinkedHashMaps“ vidines nuorodas atgal į atitinkamus objektus.

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

Siekiant užkirsti kelią „classType“ iš anksto žinomam, aš priverstinai taikomas, kai rūšiuoju papildomą kortelę, kurioje yra <key, classNameString> . Taigi, atsijungimo metu tipas klasė gali būti gaunama dinamiškai.

0
09 мая '14 в 12:27 2014-05-09 12:27 Atsakymą pateikė Stijn V gegužės 9 d. 14 d. 12:27 2014-05-09 12:27

Būtent tai man padėjo:

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

Didžioji šio klausimo dalis yra: Kaip konvertuoti JSONObject naują žemėlapį visiems jo raktams naudojant „Java“ iteratorių

0
14 янв. Atsakymas pateikiamas NancySchorr 14 sausis 2018-01-14 02:01 '18, 02:01 am 2018-14-14 02:01

Kiti klausimai apie žymes arba Užduoti klausimą