【问题标题】:How to convert Json to List in c# without dependant class如何在没有依赖类的情况下在c#中将Json转换为List
【发布时间】:2017-06-01 06:14:20
【问题描述】:

我需要将 Json 序列化为值列表,并且不希望任何依赖类(意味着 get、set),因为动态更改 Json 键并在执行后增加数千个键(我有一个外部 json文件)。

我搜索了很多链接,但无法解决我只得到转换字典类型的问题。 示例json如下,

{"ALC":"FSC","AVS":"7","CAB":"M","CL":"W","CNF":"N","CNX":"N","DES":"DEL","DTE":"3","EDT":"29 Jun 2017 09:20","FBAG":"15 Kg","FBC":"W2IPO","FCUR":null,"FN":"9W 822","FQT":true,"FRI":"FSC0","FYT":"160","ITN":"0","JYT":"160","MCL":"0","OFF":0,"OFI":false,"OFR":null,"ORG":"MAA","PC":"9W","RBD":null,"RFN":"False","RTK":"TAX:1801ASPLIT2901ASPLIT1101ASPLITADT1ASPLIT","SDT":"29 Jun 2017 06:40","SGD":"Aircraft Type : 738\u000d\u000aJourney Time : 160\u000d\u000aStart Terminal : 1\u000d\u000aEndTerminal : 3\u000d\u000aBaggage : 15 Kg","SGR":"","STE":"1","STP":"0","TNF":false,"VIA":"","VIAITN":null}

过去一天我一直在这个问题上。请任何人提供解决方案。我的代码如下..

  var json = File.ReadAllText(Server.MapPath("JSON/Flight_res.txt"));
  JToken rss = JObject.Parse(json);
  var items= rss.SelectToken("FL").ToString();
  var jss = new JavaScriptSerializer();

  dynamic listofobj = jss.Deserialize<dynamic>(items.ToString());

【问题讨论】:

  • 您的数据结构似乎是扁平的?拿字典有什么问题?你有重复的键吗?
  • 没有重复的键。但我需要值列表。becz ajax 不支持值字典
  • 您是要序列化(object->json)还是deserialize(json->object)?
  • 反序列化 Json 字符串并尝试转换为列表
  • 您尝试将其反序列化为字典的内容是什么?它应该可以工作。

标签: c# json linq


【解决方案1】:

JSON.net 允许您反序列化为匿名类型,如下所述: http://www.newtonsoft.com/json/help/html/DeserializeAnonymousType.htm

所以你可以这样使用它

string json = "{\"ALC\":\"FSC\",\"AVS\":\"7\",\"CAB\":\"M\",\"CL\":\"W\",\"CNF\":\"N\",\"CNX\":\"N\",\"DES\":\"DEL\",\"DTE\":\"3\",\"EDT\":\"29 Jun 2017 09:20\",\"FBAG\":\"15 Kg\",\"FBC\":\"W2IPO\",\"FCUR\":null,\"FN\":\"9W 822\",\"FQT\":true,\"FRI\":\"FSC0\",\"FYT\":\"160\",\"ITN\":\"0\",\"JYT\":\"160\",\"MCL\":\"0\",\"OFF\":0,\"OFI\":false,\"OFR\":null,\"ORG\":\"MAA\",\"PC\":\"9W\",\"RBD\":null,\"RFN\":\"False\",\"RTK\":\"TAX:1801ASPLIT2901ASPLIT1101ASPLITADT1ASPLIT\",\"SDT\":\"29 Jun 2017 06:40\",\"SGD\":\"Aircraft Type : 738\u000d\u000aJourney Time : 160\u000d\u000aStart Terminal : 1\u000d\u000aEndTerminal : 3\u000d\u000aBaggage : 15 Kg\",\"SGR\":\"\",\"STE\":\"1\",\"STP\":\"0\",\"TNF\":false,\"VIA\":\"\",\"VIAITN\":null}";

dynamic myData = JsonConvert.DeserializeAnonymousType(json, new ExpandoObject());

ExpandoObject 在内部实际上只是一种特殊类型的字典,因此您可以像这样通过迭代来提取数据;

foreach (var property in (IDictionary<string, string>)myData)
{
    Console.WriteLine(property.Key + ": " + property.Value);    
}

或者,如果您知道代码中的“密钥”,例如

,您可以准确指定要提取的内容
string text = myData.ALC;

但是因为 ExpandoObject 只是一种字典,所以这与通过执行以下操作直接提取到字典没有什么不同;

Dictionary<string, Object> myDict = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
foreach (var property in (IDictionary<String, string>)myDict)
{
    Console.WriteLine(property.Key + ": " + property.Value);
}

【讨论】:

  • @jason.Thanks for ur response..I got Cast exceptionon
  • 我测试了代码,它适用于您提供的示例 JSON。但随后可能会尝试更改为 .
  • 它在手动声明 json 字符串时工作正常。当我读取 json 文件时出现异常..
  • 能否提供完整 JSON 的链接?
  • 如何使用 ExpandoObject 拆分键和值
【解决方案2】:

你可以把它转换成字典。

using Newtonsoft.Json;

string jsonString = "{\"ALC\":\"FSC\",\"AVS\":\"7\",\"CAB\":\"M\",\"CL\":\"W\",\"CNF\":\"N\",\"CNX\":\"N\",\"DES\":\"DEL\",\"DTE\":\"3\",\"EDT\":\"29 Jun 2017 09:20\",\"FBAG\":\"15 Kg\",\"FBC\":\"W2IPO\",\"FCUR\":null,\"FN\":\"9W 822\",\"FQT\":true,\"FRI\":\"FSC0\",\"FYT\":\"160\",\"ITN\":\"0\",\"JYT\":\"160\",\"MCL\":\"0\",\"OFF\":0,\"OFI\":false,\"OFR\":null,\"ORG\":\"MAA\",\"PC\":\"9W\",\"RBD\":null,\"RFN\":\"False\",\"RTK\":\"TAX:1801ASPLIT2901ASPLIT1101ASPLITADT1ASPLIT\",\"SDT\":\"29 Jun 2017 06:40\",\"SGD\":\"Aircraft Type : 738\u000d\u000aJourney Time : 160\u000d\u000aStart Terminal : 1\u000d\u000aEndTerminal : 3\u000d\u000aBaggage : 15 Kg\",\"SGR\":\"\",\"STE\":\"1\",\"STP\":\"0\",\"TNF\":false,\"VIA\":\"\",\"VIAITN\":null}";

Dictionary<string, string> dict = new Dictionary<string, string>();

dict = JsonConvert.DeserializeObject <Dictionary<string, string>>(jsonString);
var list = dict.ToList(); 

编辑

var json = File.ReadAllText("Demo.json");

Dictionary<string, string> dict = new Dictionary<string, string>();

dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);

var list = dict.ToList();

这段代码运行良好。

【讨论】:

  • 我需要转换不是字典格式的值列表
  • json 基本上是一个键值对,而 List 是同类数据的集合(大多数时候)。所以根据我的理解,两者都是不同的数据结构。所以这不符合逻辑将 Json 隐藏到 List 中。
  • 它在手动声明 json 字符串时工作正常。当我读取 json 文件时出现异常。
猜你喜欢
  • 2019-10-18
  • 2017-05-20
  • 1970-01-01
  • 2017-04-05
  • 2019-03-01
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多