2016-09-16 4 views
2

Я пытаюсь десериализовать JSON из службы REST. Я десериализую JSON в структуру. Структура содержит общедоступные свойства. Я хочу скрыть основные объекты string/int и использовать правильные объекты для каждого значения. При этом я скрывал исходные свойства и хотел найти способ заполнить их, несмотря на это. Я нашел relevant answer здесь, в stackoverflow. Проблема в том, что частные свойства фактически не получают никакого значения во время десериализации.JSON.NET не десериализует приватные свойства

Я тогда попытался создать свой собственный ContractResolver. Я нашел приведенный ниже код для CreateProperty(MemberInfo member, MemberSerialization memberSerialization).

var prop = base.CreateProperty(member, memberSerialization); 
if (!prop.Writable) 
{ 
    var property = member as PropertyInfo; 
    if (property != null) 
    { 
     var hasPrivateSetter = property.GetSetMethod(true) != null; 
     prop.Writable = hasPrivateSetter; 
    } 
} 

return prop; 

Это все еще не присваивает полностью частной собственности. Я не уверен, как исходить из этого, поскольку все решения, которые я смог найти, используют варианты этих двух решений. Как мне продолжить?

EDIT:

Я создал небольшой пример, который демонстрирует мою проблему. https://gist.github.com/Herbstein/9ea14e2a4d95dd5aa4430384bfeeedf3

+0

Просьба создать [MVCE] (http://stackoverflow.com/help/mcve), чтобы продемонстрировать вашу проблему. В настоящее время вы не показываете, как выглядят ваши модели, как вы настраиваете преобразователь контрактов на seriaizer, как вы на самом деле выполняете сериализацию и т. Д. –

+0

@RB Я собираюсь сделать это сразу. – Herbstein

+0

@ RB. Я создал небольшой пример, который связан в OP. Вывод программы со всеми возможными конфигурациями - это просто пустая строка. – Herbstein

ответ

1

Это не достаточно, чтобы справиться с частным сеттеры, вы должны позволить само имущество, являющееся частным:

internal class PrivateResolver : DefaultContractResolver { 
    protected override IList<JsonProperty> CreateProperties(
     Type type, MemberSerialization memberSerialization 
    ) { 
     return type 
      .GetProperties(BindingFlags.Instance | BindingFlags.NonPublic) 
      .Select(p => CreateProperty(p, memberSerialization)) 
      .ToList(); 
    } 

    protected override JsonProperty CreateProperty(
     MemberInfo member, MemberSerialization memberSerialization 
    ) { 
     var prop = base.CreateProperty(member, memberSerialization); 
     if (!prop.Writable && (member as PropertyInfo)?.GetSetMethod(true) != null) { 
      prop.Writable = true; 
     } 
     return prop; 
    } 
} 

Я бы упущением, если бы я не упомянуть AutoMapper как более общий решение таких проблем. Это требует, чтобы вы объявляли больше классов, но также сохраняли типы сами по себе проще.

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