2017-02-24 3 views
2

安心して使用できるテストでジャクソンを使用してJSONの逆シリアル化に問題があります。 私のJSONには、文字列やBooleanのようなオブジェクトの配列になりうるキー "value"があります。ジャンパーをデシリアライズする

{ 
"value": ["value1", "value2"] 
} 

または

{ 
"value": 2272204.2426 
} 

だから私は、このフィールド用のカスタムデシリアライザ書いた:最後に

public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { 
     ObjectCodec oc = jp.getCodec(); 
     JsonNode node = oc.readTree(jp); 
     if (node.isArray()) { 
      List<String> list = new ArrayList<>(); 
      for (JsonNode elementNode : node) { 
       list.add(oc.treeToValue(elementNode, String.class)); 
      } 
      return list; 
     } else { 
      if(node.isDouble()) { 
       return oc.treeToValue(node, Double.class); 
      } 
      else if(node.isBoolean()){ 
       return oc.treeToValue(node, Boolean.class); 
      } 
      else { 
       return oc.treeToValue(node, String.class); 
      } 
     } 
    } 

を私が試した2272204.2426のような数値が2272204.2 にデシリアライズされていることに気付きましたそれをGsonを使用してデシリアライズするとうまくいきます。なぜジャクソンを使うと小数部がないのですか? 私はコードをデバッグしようとしましたが、私はこのステップで気付いています。JsonNode node = oc.readTree(jp);値は2272204.2です。

答えて

1

なぜ、ObjectMapperをジャクソンから使用しないのですか? ObjectCodecとは異なり、DeserializationFeatureを追加することができます。 Mapperは実際にコーデックを拡張していますが、この場合に必要な機能が豊富です。私は、この値フィールドが配列またはオブジェクトであることを述べた

+1

ObjectMapper mapper = new ObjectMapper(); mapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS); JsonNode node = //node where the value is defined as Double Double value = null; try { value = mapper.treeToValue(node, Double.class); } catch (IOException e) { e.printStackTrace(); } System.out.println(value); 

があなたのnode.isDouble()場合には上記のロジックを使用し、それは私がカスタムデシリアライザを使用する理由であると私は=を使用して(この建設 @JsonDeserializeを使用していますValueDeserializer.class) プライベートオブジェクトの値。 値は、ターゲットオブジェクトの多くのフィールドの1つに過ぎません。 – baadnews

+0

ありがとうございます。それは大丈夫です。別のケースでは、JsonPathを使用して特定のノードからオブジェクトを取得するときに小数部分が欠落していることに気付きました。残りの保証されたプロジェクトの問題リストによれば、JsonPath(文字列)は小数点を丸めます。 – baadnews

関連する問題