2015-07-30 3 views
1

Я знаю [JsonIgnore] игнорирующего свойство в целом, я не знаю ShouldSerializePropertyName, который дает условную сериализацию, но я не могу найти что-нибудь, чтобы отметить свойство сериализации в JSON нормально, но не устанавливаются во время десериализации.JSON.NET (WebApi2) - сериализовать свойство, но пропустить во время десериализации

Я мог бы написать обходной путь:

[JsonIgnore] 
public string MyValue{get;set;} 

public string MyValueForJson {get{return MyValue;} 

но это последнее средство. Есть ли какой-то способ - кроме настраиваемых преобразователей и т. Д. - чтобы выразить, что я не хочу, чтобы это поле было заполнено во время десериализации?

+0

В качестве побочного примечания: Я решил по-настоящему пойти с отдельными моделями для сериализации/десериализации по различным причинам, поэтому вопрос уже не важен - однако, я думаю, что это все еще хороший вопрос :) – Gerino

+0

Странно, что мы попросили об этом в тот же день: http://stackoverflow.com/questions/31731320/serialize-property-but-do-not-deserialize-property-in-json-net Я не видел до тех пор, пока я не набрал имя, но я не нашел никого другого, спрашивающего об этом. –

ответ

0

Я думаю, вы можете поместить свойство [JsonObject (MemberSerialization.OptIn)] в класс, что требует явного указания свойств для сериализации. Затем вы можете использовать как [JsonProperty], так и [JsonIgnore] свойство, которое вы хотели бы сериализовать как нормальное, но игнорировать при десериализации.

Пример:

[JsonObject(MemberSerialization.OptIn)] 
    private class UserData 
    { 
     [JsonProperty]  
     public string Token { get; set; } 

     [JsonProperty] 
     public string Username { get; set; } 

     [JsonIgnore] 
     [JsonProperty] 
     public string Password { get; set; } 
    } 
+0

Я не верю, что это сработает. В документации (http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_MemberSerialization.htm) указано: OptOut - все публичные члены сериализованы по умолчанию. Члены могут быть исключены с помощью JsonIgnoreAttribute или NonSerializedAttribute. OptIn - только участники должны быть отмечены с помощью JsonPropertyAttribute или DataMemberAttribute. –

+0

Проверьте атрибут OptIn в документации, это атрибут, который я использовал –

+0

Это работает? Я думал, что «JsonIgnore» для «OptOut» и «JsonProperty» использовался для «OptIn», но в любом случае эти атрибуты влияют как на сериализацию, так и на десериализацию, а не только на одну сторону монеты. –

1

Как я понимаю, вы хотите сериализовать объект со всеми свойствами в JSon строки, но получить только выбранные свойства при десериализации на этой строке.

Если это случай, у меня было аналогичное требование, когда я создал классы BaseType и DerivedType, а затем сериализую производный тип в строку Json, а десериализация - в экземпляр базового типа. Таким образом, написал этот код:

using System.Web.Script.Serialization; 

    public static TB CastToBase<T, TB>(this T derivedTypeInstance) 
     { 
      var serializer = new JavaScriptSerializer(); 
      var baseTypeInstance = serializer.Deserialize<TB>(serializer.Serialize(derivedTypeInstance)); 
      return baseTypeInstance; 
     } 
+0

Мне это нравится - даже если это своего рода растяжка относительно того, для чего должна использоваться иерархия классов;) – Gerino

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