Serializing an interface/abstract object using NewtonSoft.JSON

前端 未结 1 699
野性不改
野性不改 2020-12-01 22:08

One way of deserializing interface and abstract properties is a class is by setting TypeNameHandling to Auto during serialization and deserialization. However, when I try th

相关标签:
1条回答
  • 2020-12-01 22:22

    To enable output of $type information at the root level for a polymorphic object with TypeNameHandling.Auto, use the following overload: JsonConvert.SerializeObject Method (Object, Type, JsonSerializerSettings). From the docs:

    public static string SerializeObject(
        Object value,
        Type type,
        JsonSerializerSettings settings
    )
    

    type Type: System.Type The type of the value being serialized. This parameter is used when TypeNameHandling is Auto to write out the type name if the type of the value does not match. Specifing the type is optional.

    In your case, you would do:

    var stringA = JsonConvert.SerializeObject(a, typeof(ISample), settings);
    var stringB = JsonConvert.SerializeObject(b, typeof(ISample), settings);
    
    Console.WriteLine(stringA);
    Console.WriteLine(stringB);
    

    And get the result:

    {"$type":"Tile.TestJsonDotNet.A, Tile","Key":"keyA"}
    {"$type":"Tile.TestJsonDotNet.B, Tile","Key":"keyB"}
    

    Do take note of this caution from the Newtonsoft docs:

    TypeNameHandling should be used with caution when your application deserializes JSON from an external source. Incoming types should be validated with a custom SerializationBinder when deserializing with a value other than None.

    For a discussion of why this may be necessary, see TypeNameHandling caution in Newtonsoft Json, How to configure Json.NET to create a vulnerable web API, and Alvaro Muñoz & Oleksandr Mirosh's blackhat paper https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf

    0 讨论(0)
提交回复
热议问题