以下のテキストの壁の前に要約します:-)
Jackson とカスタム デシリアライザーを使用して Dictionary をデシリアライズする方法についてサポートが必要です。
現在、Android アプリと .NET (C#) サーバーとの通信があります。JSON を使用して通信します。
JAVA 側では、Jackson を使用して JSON を処理しています。.NET 側では、組み込みの DataContractSerializer を使用しています (私は知っていますが、ppl は何か他のものを使用する必要があるとコメントし始めますが、私はそうではありません... ; -) )
問題は、私が C# から辞書を送信していて、それを Java 側で HashMaps に逆シリアル化したいことですが、それを行う方法に関する適切なリソースが見つかりませんでした。
C# から送信している辞書の一例:
// Here, the object Equipment is the key, and the int following indicates the amount
[DataMember]
public Dictionary<Equipment, int> EquipmentList { get; set; }
参考までに、C# の Equipment オブジェクト:
[DataContract]
public class Equipment
{
[DataMember]
public uint Id { get; set; }
[DataMember]
public string Name { get; set; }
public override bool Equals(object obj)
{
if (obj.GetType() != this.GetType())
return false;
Equipment e = (Equipment)obj;
return e.Id == this.Id;
}
}
C# 側で適切な JSON に正しくシリアル化されると、ディクショナリは次のようになります。
//....
"EquipmentList":[
{
"Key":{
"EquipmentId":123,
"Name":"MyName"
},
"Value":1
}
//....
次のように、カスタム シリアライザー (CustomMapSerializer) を追加しました。
public static ObjectMapper mapper = new ObjectMapper();
private static SimpleDeserializers simpleDeserializers = new SimpleDeserializers();
private static StdDeserializerProvider sp = new StdDeserializerProvider();
public static void InitSerialization()
{
simpleDeserializers.addDeserializer(String.class, new CustomStringDeserializer());
simpleDeserializers.addDeserializer(Map.class, new CustomMapDeserializer());
sp.withAdditionalDeserializers(simpleDeserializers);
mapper.setDeserializerProvider(sp);
}
そして、フィールドを次のように装飾しました。
@JsonDeserialize(using=CustomMapDeserializer.class)
public Map<Equipment, Integer> EquipmentList;
そして最後に、それを実行すると、カスタム デシリアライザー クラスでブレークが発生しますが、ここから先に進む方法がわかりません。
public class CustomMapDeserializer extends JsonDeserializer<Map> {
@Override
public Map deserialize(JsonParser arg0, DeserializationContext arg1) throws IOException, JsonProcessingException
{
return new HashMap<Object, Object>(); // <-- I can break here
}
}
したがって、正しい値を含む HashMap を作成する方法、つまりシリアル化解除された Equipment をキーとして、Int を値として作成する方法についての入力が必要です。
助けてくれる人はいますか?=)