Csharp/C#教程:在没有唯一属性名称的情况下反序列化JSON分享


在没有唯一属性名称的情况下反序列化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使用该属性执行适当转换的方法。 您可以创建一个字典,每次添加一个条目时执行从JTokenItem的转换(使用常规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

(0)
上一篇 2021年11月18日
下一篇 2021年11月18日

精彩推荐