我正在使用一个返回"条目"数组的API。记录。
我想创建一个类定义,可以用来反序列化整个json对象。
我希望有一个库支持这个存在,我只标记了json.net,因为我过去使用过它。我什么都愿意。
每个条目中的一个属性具有代表一致数据结构的名称,但每次都具有不同的名称。属性名确实有一种格式,如果有帮助的话,可以很容易地被正则表达式匹配。
这里讨论的属性是
"https://bi.com/biprws/v1/documents/1"
后面的"/1"表示一个id,它会随着每条记录而改变,并且会有像
这样的属性名"https://bi.com/biprws/v1/documents/1"
"https://bi.com/biprws/v1/documents/123"
"https://bi.com/biprws/v1/documents/12345"
等
API返回的json,为了简洁,只有一条记录
"entries": [
{
"https://bi.com/biprws/v1/documents/1": {
"__deferred": {
"uri": "https://bi.com/biprws/v1/documents/1"
}
},
"cuid": "x",
"name": "x",
"description": "",
"id": "1",
"type": "x",
"ownerid": "1",
"updated": "Jan 01, 2023 00:07 AM",
"parentid": "1"
},
]
我相信我的问题与版主链接的问题不同,因为数据模式更复杂。
dbc在评论中建议的这篇文章对我很有帮助。如何反序列化一个具有动态(数字)键名的子对象?
它不能完全工作,因为它不能正确地填充动态属性的值,所以它不一定对每个人都有帮助,但在我的情况下,动态属性名称对我来说已经足够了。
你可以试试下面的代码
JArray entriesArr = (JArray)JObject.Parse(json)["entries"];
foreach (JObject item in entriesArr)
{
var prop = item.Properties()
.Where(v => v.Value.Type == JTokenType.Object).FirstOrDefault();
item.AddFirst(new JProperty("uri", prop.Value));
prop.Remove();
}
List<Entry> entries = entriesArr.ToObject<List<Entry>>();
public partial class Entry
{
public Url Uri { get; set; }
[JsonProperty("cuid")]
public string Cuid { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("description")]
public string Description { get; set; }
[JsonProperty("id")]
public long Id { get; set; }
[JsonProperty("type")]
public string Type { get; set; }
[JsonProperty("ownerid")]
public long Ownerid { get; set; }
[JsonProperty("updated")]
public string Updated { get; set; }
[JsonProperty("parentid")]
public long Parentid { get; set; }
}
public partial class Url
{
[JsonProperty("__deferred")]
public Deferred Deferred { get; set; }
}
public partial class Deferred
{
[JsonProperty("uri")]
public Uri Uri { get; set; }
}