c# Tipo de serialización y deserialización que extiende IEnumerable<KeyValuePair<cadena, objeto>>



json parse.com (0)

Estoy trabajando con la API de Parse.com en C # y tratando de serializar una clase que extienda ParseObject:

[ParseClassName("Battle")]
public class Battle : ParseObject
{
    [ParseFieldName("mapName")]
    public string MapName
    {
        get { return GetProperty<string>("MapName"); }
        set { SetProperty<string>(value, "MapName"); }
    }
}

Porque ParseObject es

IEnumerable<KeyValuePair<string, object>>

El resultado es incorrecto:

[ { "Key": "mapName", "Value": "Worlds Collide" } ]

Debería verse así:

{ MapName: "Worlds Collide" }

Intenté escribir un JsonConverter personalizado para manejarlo, pero no puedo por mi vida hacer que se deserialice adecuadamente.

public class ParseObjectJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        var can = objectType.IsSubclassOf(typeof(ParseObject));
        return can;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // Load JObject from stream
        var jObject = JObject.Load(reader);

        var target = Activator.CreateInstance(objectType);

        var properties = objectType.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance)
            .Where(prop => prop.GetSetMethod() != null).ToList();

        foreach (var p in jObject.Properties())
        {
            var targetProp = properties.FirstOrDefault(prop => prop.Name == p.Name);
            if(targetProp==null) continue;               

            targetProp.SetValue(target,  p.Value, null);
        }

        return target;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var properties = value.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance)
            .Where(prop => prop.GetSetMethod() != null).Where(prop => prop.GetValue(value, null) != null).ToList();

        writer.WriteStartObject();

        foreach(var prop in properties)
        {
            writer.WritePropertyName(prop.Name);
            serializer.Serialize(writer, prop.GetValue(value, null));
        }

        writer.WriteEndObject();
    }    
}

¿Alguien ha tratado de serializar un ParseObject antes o tiene alguna idea de cómo debería hacerlo?





json.net