gpt4 book ai didi

c# - 使用带有 JSON.Net 的自定义反序列化器反序列化 JSON

转载 作者:太空狗 更新时间:2023-10-29 21:17:47 28 4
gpt4 key购买 nike

我有如下所示的 JSON:

{
"MobileSiteContents": {
"au/en": [
"http://www.url1.com",
"http://www.url2.com",

],
"cn/zh": [
"http://www.url2643.com",

]
}
}

我正在尝试将其反序列化为类的 IEnumerable,如下所示:

public class MobileSiteContentsContentSectionItem : ContentSectionItem
{
public string[] Urls { get; set; }
}

public abstract class ContentSectionItem
{
public string Culture { get; set; }
}

这可能吗?
我意识到我可能需要为此使用自定义 JsonConverter,但找不到任何示例。

我开始编写一个使用 JObject.Parse 进行转换的方法,但不确定这是否是正确/最有效的方法:

public IEnumerable<MobileSiteContentsContentSectionItem> Parse(string json)
{
var jobject = JObject.Parse(json);

var result = new List<MobileSiteContentsContentSectionItem>();

foreach (var item in jobject.Children())
{
var culture = item.Path;
string[] urls = new[] { "" }; //= this is the part I'm having troble with here...

result.Add(new MobileSiteContentsContentSectionItem { Culture = culture, Urls = urls });
}

return result;
}

最佳答案

您走在正确的轨道上。以下是您需要进行的更正:

  1. 您正在遍历顶级对象的子对象,希望获得实际上位于下一层对象中的数据。您需要导航到 MobileSiteContents属性并遍历它的子项。
  2. 当您乘坐 Children()JObject ,使用允许您将它们转换为 JProperty 的重载对象;这将使提取所需数据变得更加容易。
  3. 获取 culture来自 NameJProperty
  4. 获取urls , 得到 ValueJProperty项目和用途ToObject<string[]>()将其转换为字符串数组。

修改后的代码如下:

public IEnumerable<MobileSiteContentsContentSectionItem> Parse(string json)
{
var jObject = JObject.Parse(json);

var result = new List<MobileSiteContentsContentSectionItem>();

foreach (var item in jObject["MobileSiteContents"].Children<JProperty>())
{
var culture = item.Name;
string[] urls = item.Value.ToObject<string[]>();

result.Add(new MobileSiteContentsContentSectionItem { Culture = culture, Urls = urls });
}

return result;
}

如果您喜欢简洁的代码,您可以将其简化为“一行代码”:

public IEnumerable<MobileSiteContentsContentSectionItem> Parse(string json)
{
return JObject.Parse(json)["MobileSiteContents"]
.Children<JProperty>()
.Select(prop => new MobileSiteContentsContentSectionItem
{
Culture = prop.Name,
Urls = prop.Value.ToObject<string[]>()
})
.ToList();
}

演示:

class Program
{
static void Main(string[] args)
{
string json = @"
{
""MobileSiteContents"": {
""au/en"": [
""http://www.url1.com"",
""http://www.url2.com"",
],
""cn/zh"": [
""http://www.url2643.com"",
]
}
}";

foreach (MobileSiteContentsContentSectionItem item in Parse(json))
{
Console.WriteLine(item.Culture);
foreach (string url in item.Urls)
{
Console.WriteLine(" " + url);
}
}
}

public static IEnumerable<MobileSiteContentsContentSectionItem> Parse(string json)
{
return JObject.Parse(json)["MobileSiteContents"]
.Children<JProperty>()
.Select(prop => new MobileSiteContentsContentSectionItem()
{
Culture = prop.Name,
Urls = prop.Value.ToObject<string[]>()
})
.ToList();
}

public class MobileSiteContentsContentSectionItem : ContentSectionItem
{
public string[] Urls { get; set; }
}

public abstract class ContentSectionItem
{
public string Culture { get; set; }
}
}

输出:

au/en
http://www.url1.com
http://www.url2.com
cn/zh
http://www.url2643.com

关于c# - 使用带有 JSON.Net 的自定义反序列化器反序列化 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19432236/

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