[c#] wie JSON in IEnumerable <BaseType> mit Newtonsoft JSON.NET deserialisiert wird



Answers

Hier ist eine Möglichkeit, dies zu tun, ohne $ type in den json zu füllen.

Ein Json-Konverter:

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

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jo = JObject.Load(reader);
        if (jo["FooBarBuzz"].Value<string>() == "A")
            return jo.ToObject<AFoo>(serializer);

        if (jo["FooBarBuzz"].Value<string>() == "B")
            return jo.ToObject<BFoo>(serializer);

        return null;
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

es benutzen:

var test = JsonConvert.DeserializeObject<List<BaseFoo>>(result, new JsonSerializerSettings() 
{ 
    Converters = { new FooConverter() }
});

von here

Question

JSON gegeben:

[
  {
    "$id": "1",
    "$type": "MyAssembly.ClassA, MyAssembly",
    "Email": "me@here.com",
  },
  {
    "$id": "2",
    "$type": "MyAssembly.ClassB, MyAssembly",
    "Email": "me@here.com",
  }
]

und diese Klassen:

public abstract class BaseClass
{
    public string Email;
}
public class ClassA : BaseClass
{
}
public class ClassB : BaseClass
{
}

Wie kann ich das JSON in Folgendes deserialisieren:

IEnumerable<BaseClass> deserialized;

Ich kann JsonConvert.Deserialize<IEnumerable<BaseClass>>() da es beschwert, dass BaseClass abstrakt ist.




Sie könnten das Enumerable auch in eine Klasse einfügen:

class Wrapper
{
    IEnumerable<BaseClass> classes;
}

dann serialisieren und deserialisieren.




Links



Tags

c# c#   json.net