gpt4 book ai didi

c# - 将索引属性反序列化为数组

转载 作者:行者123 更新时间:2023-11-30 16:48:37 26 4
gpt4 key购买 nike

假设我有一些 Json 会像这样放在一个数据包中:

{
"LinkType1": "google",
"LinkUrl1": "https://plus.google.com/test",
"LinkShow1": 1,

"LinkType2": "facebook",
"LinkUrl2": "https://www.facebook.com/test",
"LinkShow2": 0,

"LinkType3": "linkedin",
"LinkUrl3": "http://www.linkedin.com/test",
"LinkShow3": 1,

"count": 3,
"errorCode": 0,
"errorMessage": "Success"
}

注意所有的东西是如何作为相同的属性返回的,但是上面有一个索引?

我希望能够反序列化该数据,就好像它是一个数组而不是单个属性一样。将其反序列化为以下类的最佳方法是什么?我正在使用 Newtonsoft Json 库进行序列化,因此首选使用它的解决方案。

    public class LinksResult
{
public List<LinkData> Links { get; set; }

[JsonProperty("count")]
public int Count { get; set; }

[JsonProperty("errorCode")]
public int ErrorCode { get; set; }

[JsonProperty("errorMessage")]
public string ErrorMessage { get; set; }
}

public class LinkData
{
public string LinkType { get; set; }
public string LinkUrl { get; set; }
public bool LinkShow { get; set; }
}

最佳答案

您可以使用自定义 JsonConverter 将 JSON 数据反序列化为您想要的结构。转换器的代码可能如下所示。

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

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject obj = JObject.Load(reader);
LinksResult result = new LinksResult();
result.Count = (int)obj["count"];
result.ErrorCode = (int)obj["errorCode"];
result.ErrorMessage = (string)obj["errorMessage"];
result.Links = new List<LinkData>();

for (int i = 1; i <= result.Count; i++)
{
string index = i.ToString();
LinkData link = new LinkData();
link.LinkType = (string)obj["LinkType" + index];
link.LinkUrl = (string)obj["LinkUrl" + index];
link.LinkShow = (int)obj["LinkShow" + index] == 1;
result.Links.Add(link);
}

return result;
}

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

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

要使用转换器,只需将 [JsonConverter] 属性添加到您的 LinksResult 类,如下所示。 (请注意,使用此方法不需要 [JsonProperty] 属性,因为 JSON 属性名称和实际类成员之间的映射由转换器直接处理。)

[JsonConverter(typeof(LinksResultConverter))]
public class LinksResult
{
public List<LinkData> Links { get; set; }
public int Count { get; set; }
public int ErrorCode { get; set; }
public string ErrorMessage { get; set; }
}

然后,你可以这样反序列化:

LinksResult result = JsonConvert.DeserializeObject<LinksResult>(json);

fiddle :https://dotnetfiddle.net/56b34H

关于c# - 将索引属性反序列化为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37930700/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com