此Imgur api调用返回一个列表,其中包含json中表示的Gallery Image和Gallery Album类.
我不知道如何使用Json.NET自动反序列化这些,因为没有$ type属性告诉反序列化器要表示哪个类.有一个名为"IsAlbum"的属性可用于区分两者.
这个问题似乎显示了一种方法,但它看起来有点像黑客.
我该如何反序列化这些类?(使用C#,Json.NET).
样本数据:
图库图片
{
"id": "OUHDm",
"title": "My most recent drawing. Spent over 100 hours.",
...
"is_album": false
}
Run Code Online (Sandbox Code Playgroud)
画廊专辑
{
"id": "lDRB2",
"title": "Imgur Office",
...
"is_album": true,
"images_count": 3,
"images": [
{
"id": "24nLu",
...
"link": "http://i.imgur.com/24nLu.jpg"
},
{
"id": "Ziz25",
...
"link": "http://i.imgur.com/Ziz25.jpg"
},
{
"id": "9tzW6",
...
"link": "http://i.imgur.com/9tzW6.jpg"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
}
我们希望能够从/向C#类序列化/反序列化json,主类具有多态子对象的实例.使用Json.Net的TypeNameHandling.Auto设置很容易.但是,我们希望在没有"$ type"字段的情况下这样做.
第一个想法是能够将"$ type"重命名为我们选择的值,并使该类型的值为枚举,以便正确映射子类型.我没有看到这是一个选项,但很高兴听到是否有可能.
第二个想法是沿着以下几行......下面是类的第一次传递,顶级类有一个指示符(SubTypeType),关于子对象(SubTypeData)中包含的数据类型.我已经挖了一些Json.Net文档,并尝试了一些东西,但没有运气.
我们目前完全控制数据定义,但一旦部署,就会锁定.
public class MainClass
{
public SubType SubTypeType { get; set; }
public SubTypeClassBase SubTypeData { get; set; }
}
public class SubTypeClassBase
{
}
public class SubTypeClass1 : SubTypeClassBase
{
public string AaaField { get; set; }
}
public class SubTypeClass2 : SubTypeClassBase
{
public string ZzzField { get; set; }
}
Run Code Online (Sandbox Code Playgroud) 我有一个来自客户端并自动从 Web Api 2 反序列化的对象。
现在我的模型的一个属性有问题。此属性“CurrentField”属于 IField 类型,此接口有 2 种不同的实现。
这是我的模型(只是一个假人)
public class MyTest
{
public IField CurrentField {get;set;}
}
public interface IField{
string Name {get;set;}
}
public Field1 : IField{
public string Name {get;set;}
public int MyValue {get;set;}
}
public Field2 : IField{
public string Name {get;set;}
public string MyStringValue {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我试图创建一个自定义 JsonConverter 来找出我的客户端对象是什么类型(Field1 或 Field2),但我不知道如何。
我的转换器被调用,当我调用 var obj = JObject.load(reader); 时我可以看到对象。
但我怎样才能知道它是什么类型呢?我不能做类似的事情
if(obj is Field1) ...
Run Code Online (Sandbox Code Playgroud)
这是我应该检查的方法吗?
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer …Run Code Online (Sandbox Code Playgroud)