0

在下面的文字墙之前总结一下:-)

我需要有关如何使用 Jackson 和自定义反序列化器反序列化 Dictionary 的帮助。

现在我有一个与 .NET (C#) 服务器的 Android 应用程序通信。他们使用 JSON 进行通信。

在 JAVA 方面,我使用 Jackson 来处理 JSON,而在 .NET 方面,我使用内置的 DataContractSerializer(我知道,人们会开始评论我应该使用其他东西,但我不是这样......; -))

问题是我从 C# 发送字典,我希望将其反序列化为 HashMaps om JAVA 端,但我还没有找到一个很好的资源来做到这一点。

我从 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 作为 Key 和 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 回答