2013-02-18 12 views
49

Czy istnieje sposób konwertowania ciągu zawierającego json na HashMap, gdzie każdy klucz jest kluczem json, a wartość jest wartością klucza json? Json nie ma zagnieżdżonych wartości. Używam biblioteki Gson.Gson do HashMap

Na przykład, biorąc pod uwagę JSON:

{ 
"id":3, 
"location":"NewYork" 
} 

Otrzymany HashMap:

<"id", "3"> 
<"location", "NewYork"> 

Dzięki

+0

@MattBall wydaje się dość nieprzyjazne przywitanie nowego użytkownika. Patrząc na odpowiedź, nie jest to wcale oczywiste i prawie proste. Kto używa "TypeToken" do czegokolwiek, kiedykolwiek? –

+0

Nie jestem pewien, co masz na myśli mówiąc "całkiem nieprzyjazne powitanie". Czy opublikowałem i zapomniałem o szorstkim komentarzu, który właśnie został usunięty? Aby odpowiedzieć na twoje pytanie: nie używam GSON, więc nie używam 'TypeToken', ale ** używam ** używam [odpowiednik w Jackson] (http://fasterxml.github.io/jackson-core /javadoc/2.2.0/com/fasterxml/jackson/core/type/TypeReference.html) dość często się cęży. –

+0

@MattBall Masz komentarz na temat tego, co zostało wypróbowane (z linkiem) i stwierdzenie, że pytanie było dość proste. –

Odpowiedz

111

Zastosowanie TypeToken, zgodnie the GSON FAQ:

Gson gson = new Gson(); 
Type stringStringMap = new TypeToken<Map<String, String>>(){}.getType(); 
Map<String,String> map = gson.fromJson(json, stringStringMap); 

Bez odlewania. Bez zbędnego tworzenia obiektów.

+1

Dzięki, działa! –

+3

Jaki jest import dla Type? Daje dziesiątki opcji. – ThePixelPony

+2

@ThePixelPony odczytać [TypeToken # getType() 'JavaDoc] (http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/reflect/TypeToken.html) dla FQCN typu zwrotu. –

7

Jeśli korzystam z rozwiązania TypToken z mapą < Enum, Obiekt> Otrzymuję "duplikat klucza: null".

Najlepszym rozwiązaniem dla mnie jest:

String json = "{\"id\":3,\"location\":\"NewYork\"}"; 
Gson gson = new Gson(); 
Map<String, Object> map = new HashMap<String, Object>(); 
map = (Map<String, Object>)gson.fromJson(json, map.getClass()); 

Wynik:

{id=3.0, location=NewYork} 
2

Lubię:

private static class MyMap extends HashMap<String,String> {}; 
... 
MyMap map = gson.fromJson(json, MyMap.class);