0

以下のテキストの壁の前に要約します:-)

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 を値として作成する方法についての入力が必要です。

助けてくれる人はいますか?=)

4

1 に答える 1

0

わかりました、しばらくテストと調査を行った後、これが私が思いついたものです。

カスタム デシリアライザーは次のようになります。

    public class CustomMapCoTravellerDeserializer extends JsonDeserializer<Map> {

    @Override
    public Map deserialize(JsonParser jp, DeserializationContext arg1) throws IOException, JsonProcessingException 
    {
        HashMap<CoTravellers, Integer> myMap = new HashMap<CoTravellers, Integer>();

            CoTravellers ct = new CoTravellers();

            jp.nextToken(); // {
            jp.nextToken(); // Key
            jp.nextToken(); // {
            jp.nextToken(); // "CoTravellerId"
            jp.nextToken(); // CoTravellerId Id
            int coTravellerValue = jp.getIntValue();
            jp.nextToken(); // Name
            jp.nextToken(); // Name Value
            String coTravellerName = jp.getText();
            jp.nextToken(); // }
            jp.nextToken(); // "Value"
            jp.nextToken(); // The value
            int nbr = jp.getIntValue();



            ct.CoTravellerId = coTravellerValue;
            ct.Name = coTravellerName;

            myMap.put(ct, nbr);


            return myMap;

    }   
}

私が取得しているJsonMappingExceptionのみを理解できれば、これはうまくいくと思います...しかし、私はそれについて個別に投稿します=)

于 2013-01-27T20:34:27.400 に答える