2015-08-22 2 views
0

J'ai un JSON qui ressemble à ceci:Comment désérialiser un JSON avec un entier comme clé?

{ 
"MeterRates": { 
       "0": 0.142, 
       "1024": 0.142, 
       "51200": 0.142, 
       "512000": 0.142, 
       "1024000": 0.1278, 
       "5120000": 0.1051 
      } 
} 

Ce JSON est en fait une partie d'un fichier JSON plus, je ne la partie extrait que j'avais désérialisation difficulté. J'ai besoin de désérialiser cela dans un objet Java. J'ai essayé de le faire en utilisant la classe suivante, mais cela me donne des valeurs null pour toutes les clés.

public class MeterRates { 
private Double rate0; 
private Double rate1024; 
private Double rate51200; 
private Double rate512000; 
private Double rate1024000; 
private Double rate5120000; 

@JsonProperty("0") 
public Double getRate0() { 
    return rate0; 
} 

public void setRate0(Double rate0) { 
    this.rate0 = rate0; 
} 

@JsonProperty("1024") 
public Double getRate1024() { 
    return rate1024; 
} 

public void setRate1024(Double rate1024) { 
    this.rate1024 = rate1024; 
} 

@JsonProperty("51200") 
public Double getRate51200() { 
    return rate51200; 
} 

public void setRate51200(Double rate51200) { 
    this.rate51200 = rate51200; 
} 

@JsonProperty("512000") 
public Double getRate512000() { 
    return rate512000; 
} 

public void setRate512000(Double rate512000) { 
    this.rate512000 = rate512000; 
} 

@JsonProperty("1024000") 
public Double getRate1024000() { 
    return rate1024000; 
} 

public void setRate1024000(Double rate1024000) { 
    this.rate1024000 = rate1024000; 
} 

@JsonProperty("5120000") 
public Double getRate5120000() { 
    return rate5120000; 
} 

public void setRate5120000(Double rate5120000) { 
    this.rate5120000 = rate5120000; 
} 

@Override 
public String toString() { 
    return "MeterRates [0 = " + rate0 + " 1024 = " + rate1024 + " 51200 = " + rate51200 + " 512000 = " + rate512000 + " 1024000 = " + rate1024000 
      + " 5120000 = " + rate5120000 + "]"; 
} 

}

J'ai essayé référence à this question qui a des exigences similaires, mais ne pouvait pas tout à fait obtenir la façon de le faire.

MISE À JOUR 1:

Le code que je utilise désérialiser est la suivante, où je passe la classe comme MeterRates.class:

public static <T> T unmarshalJSON(HttpEntity entity, Class<T> clazz) { 
    InputStream is = null; 

    try { 
     return new Gson().fromJson(EntityUtils.toString(entity), clazz); 
    } catch (ParseException e) { 
     throw new RuntimeException(e); 
    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } finally { 
     try { 
      if (null != is) { 
       is.close(); 
      } 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 
+0

Postez votre code. Et respectez les conventions de nommage Java: les variables commencent par une lettre minuscule. –

+0

Aussi, pourquoi utilisez-vous String, puisque les valeurs sont des nombres? Pourquoi ne pas utiliser Double à la place? –

+0

@JBNizet: Désolé pour le nom de la variable goof-up, changé cela et ajouté le code que j'utilise pour désérialiser. – jobin

Répondre

1

Vous essayez d'influencer la façon dont Gson (un mappeur JSON) désérialise un objet en annotant la classe avec annotations Jackson (un autre, différent Mapper JSON).

Cela ne peut pas fonctionner. Gson ne se soucie pas des annotations de Jackson.

Si vous souhaitez que ces annotations soient prises en compte, utilisez Jackson pour désérialiser votre JSON. Voici un exemple complet de sérialisation et de désérialisation d'un objet en utilisant Jackson (J'ai changé le type des champs en Double, car c'est ce qu'ils devraient être):

MeterRates rates = new MeterRates(); 
    rates.setRate1024(0.7654); 
    rates.setRate51200(0.4567); 
    ObjectMapper objectMapper = new ObjectMapper(); 
    String s = objectMapper.writeValueAsString(rates); 
    System.out.println("s = " + s); 
    MeterRates m = objectMapper.readValue(s, MeterRates.class); 
    System.out.println("m = " + m); 
+0

J'utilise Gson pour désérialiser la structure complète de JSON, est-il possible de modifier la solution pour qu'elle fonctionne avec Gson à la place? – jobin

+0

Je ne suis pas habitué à Gson, mais il a une bonne documentation. Lis le. Un coup d'œil de 2 minutes à la table des matières du guide de l'utilisateur a suffi pour trouver ceci: https://sites.google.com/site/gson/gson-user-guide#TOC-JSON-Field-Naming-Support –

+0

J'ai supprimé jackson annotations avec les annotations GSON ('@ SerializedName') et cela fonctionne maintenant. Merci! – jobin