2012-09-19 13 views
6

Chcę ustawić serializator umów tylko dla niektórych typów w mojej aplikacji ASP.NET Web API. Mogę ustawić ustawienia globalnie w App_Start/FormatterConfig.cs jak ten:Jak ustawić Json.NET ContractSerializer dla określonego określonego typu zamiast globalnie?

public static void RegisterGlobalFormatters(MediaTypeFormatterCollection formatters) 
{ 
    jsonSerializerSettings.ContractResolver = new CriteriaContractResolver(new List<string>(new string[]{"mdData", "name", "label"})); 

...

ale jak można po prostu zastosować to do jednego lub więcej określonych typów klasowych?

Powodem chcę to zrobić, bo muszę być w stanie określić, które pola powinny być szeregowane w czasie wykonywania na podstawie konfiguracji lub parametrów do usługi internetowej podobny do tych przykładów:

Using JSON.net, how do I prevent serializing properties of a derived class, when used in a base class context?

http://json.codeplex.com/discussions/347610

Odpowiedz

1

skończyło się używając JsonConverter że tylko zapisuje parametry określone na liście "właściwości". Jest bardziej niższy niż obiekt ContractResolver lub formater, ale nie sądzę, że można go skonfigurować dla konkretnego typu.

public class ResourceConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return (objectType == typeof(Resource)); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     List<string> properties = new List<string>(new string[] { "Name", "Label" }); 

     writer.WriteStartObject(); 
     foreach (MemberInfo mi in value.GetType().GetMembers(BindingFlags.GetField | BindingFlags.Instance | BindingFlags.Public)) 
     { 
      PropertyInfo p = mi as PropertyInfo; 

      if (p != null && p.GetCustomAttributes(typeof(JsonIgnoreAttribute), true).Length == 0 && properties.Contains(p.Name)) 
      { 
       writer.WritePropertyName(p.Name); 
       serializer.Serialize(writer, p.GetValue(value, new object[] { })); 
      } 
     } 
     writer.WriteEndObject(); 
    } 
} 

ta może być stosowana do klasy przy użyciu atrybutu:

[JsonConverter(typeof(ResourceConverter))] 

Wydaje się hack choć myślę, że powinienem użyć rozpoznawania nazw zamówienia, aby uzyskać listę właściwości do serializacji zamiast używając bezpośredniego odbicia, ale nie jestem pewien jak.

4

masz kilka opcji:

  • utworzyć typ niestandardowy jest obsługiwany przez niestandardowym formatt er. Zwyczaj ten typ mógł określić (w jakiś sposób), co pola muszą być w odcinkach (a informacje te następnie wprowadzono do serializatora Json)
  • Spójrz na kontrolerze konfiguracji (patrz here), aby spróbować i konfiguracja formater jako wymagane na
+0

Twoja pierwsza opcja doprowadziła mnie do stworzenia niestandardowego JsonConvertera, który jest bardziej niski niż formatyzator, ale nie mogłem wymyślić, jak określić formatter dla określonego typu. – Rn222

0

chciałbym spróbować stworzyć coś w tym

public class MyJsonFormatter : JsonMediaTypeFormatter 
    { 
     public override bool CanWriteType(Type type) 
     { 
      return type == typeof(MyClass); 
     } 
    } 

a następnie włóż to do początku zbierania formatujących

+0

Wygląda na to, że wybieramy tylko formatator raz na żądanie w zależności od typu przekształcanego serializowanego obiektu root. Nie zadziała w moim przypadku, ponieważ mam obiekt opakowania, do którego nie chcę zastosować ustawień. – Rn222

Powiązane problemy