2013-01-10 18 views
14

Mam obiekt użytkownika z tej struktury:deserializacji mapie <String, Object> pole z Gson

class User { 
    private String id; 
    private String name; 
    private Map<String, Object> properties; 

    // GETTERS & SETTERS 
} 

Mam JSON String z tej struktury: Klucze

{ 
    "user": { 
     "id:"123456789", 
     "name:"azerty", 
     "emailHash":"123456789", // not used in User class 
     "properties": { 
      "p1":1, 
      "p2":"test", 
      "p3":[1, 2, 3, 4], 
      "p4":{ 
       etc... 
      } 
     } 
    } 
} 

właściwości są ciąg wartości właściwości może być ciągiem, int, szyk, boolean, mapa itp

próbuję deserializowania ten ciąg JSON z Gson tak:

JsonParser parser = new JsonParser(); 
JsonElement element = parser.parse(jsonString); 
JsonObject object = element.getAsJsonObject(); 

GsonBuilder builder = new GsonBuilder(); 
builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); 
Gson gson = builder.create(); 
User user = (User) gson.fromJson(object.get("user"), new TypeToken<User>() {}.getType()); 

Nazwy pól "id" i "nazwa" są prawidłowo wprowadzane, ale pole "właściwości" pozostaje puste.

Czy wiesz, co robię źle? Z góry dziękujemy za pomoc!

+0

Proponuję o właściwości jak 'JsonObject' a następnie przekształcenie JSON bezpośrednio do' Map '. – Srinivas

+0

Twój kod działa doskonale z jednym małym problemem: wydajesz się, że stworzyłeś 'GsonBuilder' o nazwie' builder', ale używasz jednego o nazwie 'gsonBuilder'. Jeśli to faktycznie kompiluje, to masz inny "GsonBuilder", który wcześniej utworzyłeś i używasz go przez pomyłkę. Poza tym ... deserializuje się dobrze na mojej maszynie. –

+0

'gsonBuilder' jest błędem podczas pisania tematu. To 'builder', którego używam w moim kodzie. Będę edytować mój temat do korekty. Pole 'properties' jest poprawnie wstrzyknięte w twoim teście? To bardzo dziwne, że pozostaje dla mnie nieważne ... –

Odpowiedz

9

Dla mnie ten kod:

public class Main { 
    public static void main(String[] args) throws IOException { 
    GsonBuilder builder = new GsonBuilder(); 
    builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); 
    Gson gson = builder.create(); 
    FileInputStream inputStream = new FileInputStream(new File("bobi.json")); 
    InputStreamReader reader = new InputStreamReader(inputStream); 
    User user = gson.fromJson(reader, User.class); 
    System.out.println(user.getName()); 
    System.out.println(user.getId()); 
    for (String property : user.getProperties().keySet()) { 
     System.out.println("Key: " + property + " value: " + user.getProperties().get(property)); 
    } 
    reader.close(); 
} 

drukuje:

azerty 
123456789 
Key: p1 value: 1.0 
Key: p2 value: test 
Key: p3 value: [1.0, 2.0, 3.0, 4.0] 
Key: p4 value: {} 

jednak pamiętać, że mam pozbawiony json obiektu owijania w pliku I analizować. Plik jest:

{ 
     "id":"123456789", 
     "name" : "azerty", 
     "emailHash":"123456789", 
     "properties": { 
      "p1":1, 
      "p2":"test", 
      "p3":[1, 2, 3, 4], 
      "p4":{ 

      } 
     } 
} 

także dodałem zamknięciu cudzysłowu dla name i id, które nie mają w swojej próby.

Klasa User zgodnie z żądaniem PO. Dodałem pobierające i ustawiające z powodu drukowania:

import java.util.Map; 

class User { 
    private String id; 
    private String name; 
    private Map<String, Object> properties; 
    public String getId() { 
     return id; 
    } 
    public void setId(String id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public Map<String, Object> getProperties() { 
     return properties; 
    } 
    public void setProperties(Map<String, Object> properties) { 
     this.properties = properties; 
    } 
} 
+0

Czy mógłbyś opublikować obiekt 'user', którego użyłeś? Próbuję twojego kodu, ale 'properties' jest zawsze' null' ... Jestem na JDK7 i Gson 2.2.2 jeśli mogę pomóc ... –

+0

@FranckYapadesouciAnso: Dodano. Gson 2.1, java 1.7 –

+0

OK Znalazłem swój błąd. To był problem FieldNamingPolicy. Dzięki za pomoc. Miłego dnia! –

Powiązane problemy