2016-11-03 3 views
0

Я пытаюсь сериализовать и десериализовать свойство типа Dictionary<string, int> при отправке данных с сервера клиенту.Json.Net не может десериализовать объекты с несколькими родовыми типами?

Так что, если я сериализовать этот упрощенный объект:

class Foo 
{ 
    public Dictionary<string, int> Bar { get; set; } 
} 

я получаю эту милую JSON (с помощью TypeNameHandling.All):

{ 
    "$type": "Foo", 
    "Bar": { 
    "$type": "Dictionary<String, Int32>" 
    } 
} 

проблема на стороне десериализации где Я использую настраиваемый Binder, переопределяющий BindToType для десериализации. Но при этом неверно typeName, и вместо этого я получаю .

public override Type BindToType(string assemblyName, string typeName) 
{ 
    if (typeName == "Dictionary<String, Int32>") 
    { 
    // I never get here because typeName is "Dictionary<String" 
    return typeof(Dictionary<string, int>); 
    } 
    // ... 
} 
+0

почему бы вам не использовать JsonConverers при десериализации/ –

+0

@Amit Кумар Гош вы можете разместить пример как ответ, если вы хотите , Но помни; большую часть времени я не знаю, какой тип объекта ожидать на стороне десериализации. – einord

+2

Пожалуйста, отправьте сообщение [mcve]. –

ответ

0

Вы можете сделать что-то подобное для десериализации -

class customBinder : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return true; 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var type = Activator.CreateInstance(objectType); 
     var data = JObject.Load(reader); 

     var obj = JsonConvert.DeserializeObject(data.ToString(), type.GetType(), new JsonSerializerSettings 
     { 
      TypeNameHandling = TypeNameHandling.All 
     }); 

     return obj; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 

    } 
} 
Смежные вопросы