Faire GSON désérialiser les chiffres pour les nombres entiers ou en double
Je vais avoir un moment difficile avec GSON.
J'ai un simple JSON que je veux désérialiser un Map<String,Object>
.
C'est vraiment intuitif pour moi que 123 doit être analysée comme un int (ou long), 123.4 comme un float( ou double).
GSON d'autre part crée des Doubles de tous les temps.
Puis-je dire GSON de ne pas abuser de double de tous les temps?
Mon code:
Type mapType = new TypeToken<Map<String, Object>>() {}.getType();
GSON gson = new Gson();
Map<String, Object> map = gson.fromJson(someString, mapType);
- La racine du problème est qu'il n'existe qu'un seul type de Numéro. JSON n'a pas de type int - ils sont tous à virgule flottante et en décimales sont omis lorsque cela est possible.
- oui, je sais cela. Mais GSON comportement du fait de la désérialisation et la sérialisation de produire une autre sortie que de l'entrée d'origine, ce qui est vraiment méchant; par exemple, j'ai un
timestamp
champ qui est à l'origine 1234567890, et après deser-ser cycle est de 1.23456789E9 - existe-il des solutions ?
Vous devez vous connecter pour publier un commentaire.
Le code suivant compile & travaux:
Ma solution va d'abord essayer d'analyser la chaîne comme un nombre, si cela échoue, il permettra à la norme Gson deserializer faire le travail.
Si vous avez besoin d'un analyseur de numéro qui n'est pas spécifique aux paramètres régionaux utiliser cette méthode pour analyser un nombre:
Numberformat.getInstance()
retourne une instance pour le courant de paramètres régionaux par défaut.deserialize
et il n'a pas y aller encore une fois.Ce n'est pas une bonne approche de mélanger des types comme ça (entiers avec des doubles). Puisque vous êtes à l'aide de l'Objet comme un type, vous ne serez pas en mesure d'obtenir les nombres Entiers et Double à partir de la carte. Gson décide quel type est le plus adéquat pour l'Objet. Dans votre cas, il est Double, parce que toutes les valeurs PEUVENT ÊTRE doubles, mais toutes les valeurs ne PEUVENT PAS ÊTRE convertis en nombres entiers.
Si vous avez vraiment besoin de mélanger les types, essayez d'utiliser le Numéro de la classe à la place de l'Objet. Exemple:
De sortie: [1, 2.5, 4, 5.66]
Tout cela:
vous donnera de sortie: [1.0, 2.5, 4.0, 5.66]
Object
, puisque d'autres non-champs numériques peuvent être présents, comme dans toute JSON. Je veux seulement changer la manipulation de nombres..Vous pouvez effectuer les modifications suivantes dans le but d'analyser les données:
et ci-dessous votre code est effectivement de les analyser.
Si vous n'êtes pas lié spécifiquement à l'utilisation gson bibliothèque, vous pouvez résoudre ce problème à l'aide de la désérialisation jackson l'un comme suit:
Ici un complet de test junit qui exposent les différences entre les deux bibliothèques de la désérialisation d'une valeur entière: