c# - 使用 [JsonProperty] 将 Json 参数与类型为 List 的 C# 类属性匹配

标签 c# json json.net

我正在尝试反序列化以下 Json 响应(使用 Json.NET):

[{"pollid":"1", "question":"This is a test", "start":"2011-06-28", "end":"2012-03-21", "category":"Roads", "0":"Yes", "1":"No"} … ]

进入这种类型的对象:

    class Poll
    {
        [JsonProperty("pollid")]
        public int pollid { get; set; }
        [JsonProperty("question")]
        public string question { get; set; }
        [JsonProperty("start")]
        public DateTime start { get; set; }
        [JsonProperty("end")]
        public DateTime end { get; set; }
        [JsonProperty("category")]
        public string category { get; set; }

        // PROBLEM AREA
        [JsonProperty("0")] // Json parameter names are 0 to 9. How can I 'match' these to the List elements?
        public List<string> polloptions { get; set; }
    }

创建列表时如何使用 [JsonProperty] 属性? (假设这个List中要包含的Json参数名称为“0”到“9”)。在过去的几个小时里,我一直在尝试不同的方法,但都没有成功。

非常感谢

最佳答案

一个选择是做这样的事情(我首先关闭了 [JsonProperty("0")] polloptions):

int option;
Poll poll = JsonConvert.DeserializeObject<Poll>(json);
JContainer container = (JContainer)JsonConvert.DeserializeObject(json);

poll.polloptions = container.Where(t => t as JProperty != null)
    .Cast<JProperty>().Where(p => int.TryParse(p.Name, out option))
    .Select(p => p.Value.Value<string>()).ToList();

第一步是按常规反序列化 - 这将处理除 polloptions 之外的所有属性。下一步是反序列化为 JContainer,这样我们就可以获取单个标记并从具有数字名称的标记中创建一个列表(因此 int.TryParse(p.Name,输出选项))。

这将为您提供一个包含是/否值的列表。如果您还想要投票选项的名称以及值,请考虑以下内容:

polloptions 属性更改为:

public List<PollOption> polloptions { get; set; }

PollOption 是:

class PollOption
{
    public int Name { get; set; }
    public string Value { get; set; }
}

反序列化时:

Poll poll = JsonConvert.DeserializeObject<Poll>(json);
JContainer container = (JContainer)JsonConvert.DeserializeObject(json);

var pollOptionNames = container.Where(t => t as JProperty != null)
    .Cast<JProperty>().Where(p => int.TryParse(p.Name, out option))
    .Select(p => int.Parse(p.Name)).ToList();

var pollOptionValues = container.Where(t => t as JProperty != null)
    .Cast<JProperty>().Where(p => int.TryParse(p.Name, out option))
    .Select(p => p.Value.Value<string>()).ToList();

poll.polloptions = pollOptionNames.Select((n, i) =>
    new PollOption() { Name = n, Value = pollOptionValues[i] }).ToList();

关于c# - 使用 [JsonProperty] 将 Json 参数与类型为 List 的 C# 类属性匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13287086/

相关文章:

c# - 如何使用图形突出显示控件中的换行文本?

c# - Visual C# Winforms 数据库问题

python - 如何在 Python 中从此 JSON 中获取 'url' 变量

c# - 在默认构造函数中初始化的 JSON.Net 集合未被反序列化的 JSON 覆盖

.net - JSON.NET 返回未格式化的字符串

C# - 如何使用正则表达式替换 NULL 字符?

c# - 捕获所有不捕获静态文件的路由

javascript - d3复杂数据,更新现有节点

java - 如何在 JavaScript 中循环遍历 Java List<Object[]> 对象?

JSON.Net 和 Linq