此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)
}
我正在针对返回JSON数据的第三方API编程,但格式可能有点奇怪.某些属性可以是对象(包含Id属性),也可以是字符串(对象的Id).例如,以下两个都是有效的:
{
ChildObject: 'childobjectkey1'
}
Run Code Online (Sandbox Code Playgroud)
和
{
ChildObject: {
Id: 'childobjectkey1',
// (other properties)
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用JSON.net将其反序列化为强类型类,但到目前为止还没有太多运气.我最好的想法是将它序列化为两个属性,一个是字符串,另一个是对象,并为每个属性使用自定义JsonConverter来允许变量行为:
public abstract class BaseEntity
{
public string Id { get; set; }
}
public class ChildObject : BaseEntity { }
public class MyObject
{
[JsonProperty("ChildObject")]
[JsonConverter(typeof(MyCustomIdConverter))]
public string ChildObjectId { get; set; }
[JsonProperty("ChildObject")]
[JsonConverter(typeof(MyCustomObjectConverter))]
public ChildObject ChildObject { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是,JsonProperty在具有相同PropertyName的两个属性上设置属性会导致异常:
Newtonsoft.Json.JsonSerializationException:'.....'上已存在名为'ChildObject'的成员.使用JsonPropertyAttribute指定其他名称.
我很确定如果我可以克服这个障碍,JsonConverter方法将会起作用 - 我怀疑错误是存在的,因为JsonProperty属性用于序列化以及反序列化.在这个例子中,我对序列化这个类没兴趣 - 它只会被用作反序列化的目标.
我无法控制远程端(它是第三方API),但我希望能够实现此序列化.我不介意它是否正在使用我开始使用的方法,或者我还没有想到的方法.
这个问题也有关系,但没有答案.
我有一些JSON具有各种属性,其中大多数是简单的数据类型.但是,我在JSON中有一个属性,当我将它反序列化为C#类时,我只需将它反序列化为字符串.
示例JSON:
{"simpleProperty": "value1", "json":{"a":"a1", "b":"b1"}}
Run Code Online (Sandbox Code Playgroud)
除了它将是一个有效的JSON对象之外,"json"对象没有设置结构.
所以在上面的例子中,"json"的值是一个JSON对象 - 但是当它被反序列化时,我需要它作为一个字符串.
所以,如果我的C#类是:
public class MyClass
{
public string SimpleProperty { get; set; }
public string Json { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果我使用:
var myClass = JsonConvert.DeserializeObject<MyClass>(jsonStr);
Run Code Online (Sandbox Code Playgroud)
我希望myClass.Json只是一个简单的字符串.
我已经考虑过为此创建一个自定义的JsonConverter,但这对于这么简单的事情来说似乎太复杂了.我必须在这里遗漏一些东西.任何方向将不胜感激.
我也看到了这篇文章 - 但它确实没有回答这个问题:JSON.Net - 如何将JSON反序列化为对象但是将属性视为字符串而不是JSON?