Comment désérialiser une valeur float avec un localisée séparateur décimal avec Jackson

Le flux d'entrée, je suis d'analyse avec Jackson contient des valeurs de latitude et longitude comme ici:

{
    "name": "product 23",
    "latitude": "52,48264",
    "longitude": "13,31822"
}

Pour une raison quelconque, le serveur utilise des virgules comme séparateur décimal, ce qui produit un InvalidFormatException. Puisque je ne peux pas changer le serveur format de sortie je voudrais enseigner Jackson ObjectMapper pour gérer ces cas. Voici le code correspondant:

public static Object getProducts(final String inputStream) {
    ObjectMapper objectMapper = new ObjectMapper();
    try {
        return objectMapper.readValue(inputStream,
                new TypeReference<Product>() {}
        );
    } catch (UnrecognizedPropertyException e) {
        e.printStackTrace();
    } catch (InvalidFormatException e) {
        e.printStackTrace();
    } catch (JsonMappingException e) {
        e.printStackTrace();
    } catch (JsonParseException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

Et voici le POJO:

import com.fasterxml.jackson.annotation.JsonProperty;

public class Product {

    @JsonProperty("name")
    public String name;
    @JsonProperty("latitude")
    public float latitude;
    @JsonProperty("longitude")
    public float longitude;

}

Comment puis-je dire à Jackson que ces valeurs de coordonnées venir avec une version allemande?


Je suppose que une coutume deserializer pour les champs spécifiques comme discuté ici serait la voie à suivre. J'ai rédigé ceci:

public class GermanFloatDeserializer extends JsonDeserializer<Float> {

    @Override
    public Float deserialize(JsonParser parser, DeserializationContext context)
            throws IOException {
        //TODO Do some comma magic
        return floatValue;
    }

}

Puis le POJO devrait ressembler à ceci:

import com.fasterxml.jackson.annotation.JsonProperty;

public class Product {

    @JsonProperty("name")
    public String name;
    @JsonDeserialize(using = GermanFloatDeserializer.class, as = Float.class)
    @JsonProperty("latitude")
    public float latitude;
    @JsonDeserialize(using = GermanFloatDeserializer.class, as = Float.class)
    @JsonProperty("longitude")
    public float longitude;

}
Ce que vous avez est invalid JSON. Demandez à la personne de fournir le JSON vous fournir des trucs légaux.
Est-il invalide en raison de la , comme séparateur décimal? Dans le cas où vous signifiait la virgule - c'est quelque chose que j'ai oublié de taper. Je l'ai corrigé.
La virgule point décimal n'est pas valide JSON. Vous pouvez aller à json.org et de voir la syntaxe. Il est possible que la virgule apparaît parce que de toute façon votre demande au serveur implique un jeu de paramètres régionaux, et de changer ce qui impliquait locale va résoudre le problème, mais sinon les gens à l'autre bout devrait résoudre le problème.
jslint.com dit qu'il est valide. Cependant, le côté serveur n'est pas sous mon contrôle.
Eh bien, je suppose que c'est valable, parce que ceux sont des chaînes de caractères, pas des nombres. C'est à vous de gérer les chaînes de votre choix. N'a rien à voir avec JSON, en soi. Changement public float latitude; à public String latitude;, etc.

OriginalL'auteur JJD | 2014-11-03