2011-07-12 8 views
0

キーの1つにint、string、またはjsonオブジェクトの3つの値のいずれかがあるJSONがあります。以下のスニペットを使用すると、intまたはstringのときにこのフィールドをマップできますが、jsonオブジェクトの場合は失敗します。どこが間違っていますか?私は何をしなければならないのですか?JacksonのreadValueマッピングによるオーバーロードされたJavaクラスの問題

JSON値キーは次のようになります。

"value": 51, 

または

"value": 51, 

か(と私は問題を抱えていますこれはどこである)

"value": {"lat": 53.990614999999998, "lng": -1.5391117000000301, "addr": "Harrogate, North Yorkshire, UK"} 


public class Test { 

public Test() { 
} 

public static class Value { 
public int slidervalue; 
public String voicevalue; 
public GeoValue geovalue; // problem 

public Value(int value) { 
    this.slidervalue = value 
} 

public Value(String value) { 
this.voicevalue = value; 
} 

public Value(JSONObject value) { 
    JSONObject foo = value; // this is never reached 

this.geovalue = value; // and how would this work so as map value to a GeoValue? 
} 

private static class GeoValue { 
private double _lat; 
private double _lng; 
private String _addr; 

public float getLat() { 
    return (float)_lat; 
    } 
public void setLat(float lat) { 
    _lat = (double)lat; 
    } 
public float getLng() { return (float)_lng;} 
public void setLng(float lng) { _lng = (double)lng; } 

public String getAddr() { return _addr;} 
public void setAddr(String addr) { _addr = addr; } 
} 

} // end of Value class 

public Value getValue() { return _value;} 
public void setValue(Value value) { 
_value = value; 
} 
} //end of Test class 

、これは次のように使用されていますこれは:

ObjectMapper mapper = new ObjectMapper(); 
instance = mInstances.getJSONObject(i).toString(); 
Test testinstance = mapper.readValue(instance, Test.class); 


public class Test { 

public Test() { 
} 

public static class Value { 
public int slidervalue; 
public String voicevalue; 
public GeoValue geovalue; // problem 

public Value(int value) { 
    this.slidervalue = value 
} 

public Value(String value) { 
this.voicevalue = value; 
} 

public Value(JSONObject value) { 
    JSONObject foo = value; // this is never reached 

this.geovalue = value; // and how would this work so as map value to a GeoValue? 
} 

private static class GeoValue { 
private double _lat; 
private double _lng; 
private String _addr; 

public float getLat() { 
    return (float)_lat; 
    } 
public void setLat(float lat) { 
    _lat = (double)lat; 
    } 
public float getLng() { return (float)_lng;} 
public void setLng(float lng) { _lng = (double)lng; } 

public String getAddr() { return _addr;} 
public void setAddr(String addr) { _addr = addr; } 
} 

} // end of Value class 

public Value getValue() { return _value;} 
public void setValue(Value value) { 
_value = value; 
} 
} //end of Test class 

、これは次のように使用されている:

ObjectMapper mapper = new ObjectMapper(); 
instance = mInstances.getJSONObject(i).toString(); 
Test testinstance = mapper.readValue(instance, Test.class); 

これはJSONMappingExceptionで失敗します。タイプが見つかりません、適切なコンストラクタ...「値」

感謝を。アレックス

答えて

1

どう働くかもしれないが、あなたが@JsonCreatorでJSONObjectを取るコンストラクタをマークしていることですが、ために@JsonPropertyを追加しないでください単一のパラメータその場合、着信JSONはそのパラメータの型にバインドされます(この場合はJSONObjectですが、Mapも使用できます)。そしてコンストラクタに渡されます。 単一文字列/ int/long引数のコンストラクタの特別な処理のために、オーバーロードが機能します。

これが最もクリーンな解決策であるかどうかはわかりません。カスタムデシリアライザを実装するだけでもっともきれいかもしれません。しかし、それは動作するはずです。

0

あなたのコードは、あなたが望むものである場合は、あなたのJSONは次のようにする必要があります:

{"value":{"slidervalue":1,"voicevalue":"aa","geovalue":{"lat":53.990615,"lng":-1.53911170000003,"addr":"Harrogate, North Yorkshire, UK"}}} 
+0

ありがとう - しかし、 '値'は*これらのうちの1つであり、決して3つすべてではありません。私はクラスのコンストラクタシグネチャパラメータ(int/String/JSONObject)を使用して値を読み取ることができるかどうかを質問しています。アレックス – Alex

関連する問題