2013-11-19 2 views
2

Я пытаюсь использовать настраиваемые типы объектов, модифицирующих конвертер, как описано here, а также CamelCasePropertyNamesContractResolver.Пользовательский конвертер overriding ContractResolver

Так преобразователь не так (ничего не делать здесь):

class MyJsonConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType.IsSubclassOf(typeof(MyType)); 
    } 

    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) 
    { 
     JToken t = JToken.FromObject(value); 
     t.WriteTo(writer); 
    } 
} 

И я использую это так:

var jsonSerializationSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; 
jsonSerializationSettings.Converters.Add(new MyJsonConverter()); 
var camelCaseJsonOutput = await JsonConvert.SerializeObjectAsync(myObject, Formatting.None, jsonSerializationSettings); 

Но сериализованные вывод показывает свойства, начиная с прописной, так кажется, что использование моего конвертера каким-то образом отменило верблюжонный конвертор ...

ответ

2

При создании

JToken t = JToken.FromObject(value); 

Он создает raw json без форматирования. Итак, вы можете контролировать это по-своему, верблюд, Паскаль, wHaTeVeR.

, например:

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
{ 
    var myType = value as MyType; 
    if (myType != null) 
    { 
     writer.WriteStartObject(); 
     writer.WritePropertyName("myProperty"); 
     serializer.Serialize(writer, myType.myProperty); // Using this will allow to serialize inner values with CamelCasePropertyNamesContractResolver 
     writer.WritePropertyName("Inner"); 
     serializer.Serialize(writer, myType.Inner); 
     ... 
     writer.WriteEndObject(); 
    } 
} 

для сериализации объекта с верблюжьего и дополнительным свойством я идти таким образом (может быть не самым эффективным)

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

     writer.WritePropertyName("_custom_Prop_"); 
     writer.WriteValue("Custom Property value"); 

     WriteObjectProperties(writer, value); 

     writer.WriteEndObject(); 
    } 

    private static void WriteObjectProperties(JsonWriter writer, object value) 
    { 
     var myJsonWriter = new JTokenWriter(); 
     var js = new JsonSerializer(); 
     js.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
     js.Serialize(myJsonWriter, value); 
     var childTokens = myJsonWriter.Token.Children(); 
     foreach (var childToken in childTokens) 
     { 
      childToken.WriteTo(writer); 
     } 
    } 
+0

Спасибо за ваше полезное объяснение. То, что я пытаюсь достичь, - добавить специальное свойство к сериализованному объекту, когда он имеет определенный тип. Был бы какой-нибудь способ сделать это (вместе с верблюжьей оболочкой) без необходимости управлять всей сериализацией вручную? – ThomasWeiss

+1

Отредактированный ответ с примером специального имущества – pil0t

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