在没有唯一属性名称的情况下反序列化JSON
我有一个json字符串,如下所示
{ "1ST": { "name": "One", "symbol": "1st" }, "2ND": { "name": "Two", "symbol": "2nd" } }
我试图将其序列化为C#对象。 看起来它正在创建一个Dictionary,所以我创建了以下结构
public class Response { public Dictionary Objects { get; set; } } public class Item { public string name { get; set; } public string symbol { get; set; } }
并且在序列化期间运行以下内容
response = JsonConvert.DeserializeObject(jsonString);
它不会在反序列化时抛出错误,但我的响应只是返回null。 我错过了什么?
你有一个正确的基本想法,但你有一个额外的Objects
属性,你真的不需要:你的JSON 是有效的字典。 您可以直接将其反序列化为Dictionary
。 这是一个例子:
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>(json); foreach (var entry in dictionary) { Console.WriteLine($"{entry.Key}: {entry.Value}"); } } }
输出:
1ST: One/1st 2ND: Two/2nd
现在,如果您需要 Response
类型,则有多种选择:
我在最后一个方面有一些运气,但不是一个完整的解决方案。 如果将Objects
更改为Dictionary
则可以将[JsonExtensionData]
应用于它,这使其成为任何不匹配属性的默认字典。 但是,我还没有找到说服Json.NET使用该属性并执行适当转换的方法。 您可以创建一个字典,每次添加一个条目时执行从JToken
到Item
的转换(使用常规Json.NET代码),然后将该值添加到另一个字典 – 但这非常难看。 这可能只是Json.NET无法处理的情况。
建议使用强类型对象,但另一种方法是可以使用将在运行时评估的动态类型。
请看下面的代码。
请注意,我更改变量名称是因为我们无法在C#中使用numeric定义变量start。
using Newtonsoft.Json; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { var jsonString = @"{ 'First': { 'name': 'One', 'symbol': '1st' }, 'Second': { 'name': 'Two', 'symbol': '2nd' } }"; //If you want to access using strong type. var response = JsonConvert.DeserializeObject(jsonString); var secondSymbol = response.Second.symbol.ToString(); System.Console.WriteLine(secondSymbol); //If you want to access using dynamic type, will evalute in runtime. var responseDynamic = JsonConvert.DeserializeObject(jsonString); var secondSymbolDynamic = responseDynamic.Second.symbol.ToString() ; System.Console.WriteLine(secondSymbolDynamic); System.Console.ReadLine(); } public class Response { public Item First { get; set; } public Item Second { get; set; } } public class Item { public string name { get; set; } public string symbol { get; set; } } } }
希望它会有用。 ?
上述就是C#学习教程:在没有唯一属性名称的情况下反序列化JSON分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/949822.html