我有一个看起来像下面的json字符串
{
"1ST": {
"name": "One",
"symbol": "1st"
},
"2ND": {
"name": "Two",
"symbol": "2nd"
}
}
我正在尝试将其序列化为C#对象。看起来它正在创建字典,所以我创建了以下结构
public class Response
{
public Dictionary<string, Item> Objects { get; set; }
}
public class Item
{
public string name { get; set; }
public string symbol { get; set; }
}
并在序列化过程中运行以下命令
response = JsonConvert.DeserializeObject<Response>(jsonString);
它不会在反序列化上引发错误,但是我的回答只是返回为null。我想念什么?
您已经有了正确的基本概念,但是却拥有了一个Objects
您真正不想要的额外属性:JSON实际上就是字典。您可以将其直接反序列化为Dictionary<string, Item>>
。这是一个例子:
using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;
public class Item
{
public string Name { get; set; }
public string Symbol { get; set; }
public override string ToString() => $"{Name}/{Symbol}";
}
public class Test
{
static void Main()
{
var json = File.ReadAllText("test.json");
var dictionary = JsonConvert.DeserializeObject<Dictionary<string, Item>>(json);
foreach (var entry in dictionary)
{
Console.WriteLine($"{entry.Key}: {entry.Value}");
}
}
}
输出:
1ST: One/1st
2ND: Two/2nd
现在,如果你需要你的Response
类型,有不同的选项:
Dictionary<string, Item>
该Objects
属性派生并删除该属性。(如果您需要该Objects
物业,则不好。)Response
对象并自己分配属性。(如果响应是另一种类型的一部分,则不好。)Objects
视为一种“根”属性。我在最后一个方面有些运气,但还没有一个完整的解决方案。如果更改Objects
为a,Dictionary<string, JToken>
则可以将其应用[JsonExtensionData]
到它,这使它充当任何不匹配属性的默认字典。但是,我还没有找到说服Json.NET使用该属性并执行适当转换的方法。您可以创建一个字典,每次添加条目时都会执行从JToken
到的转换Item
(使用常规Json.NET代码),然后将该值添加到另一个字典中-但这很丑陋。这可能只是Json.NET无法处理的情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句