如何将Json数组转换为c#中的对象列表
我有Json字符串,如下所示
{ "JsonValues":{ "id": "MyID", "values": { "value1":{ "id": "100", "diaplayName": "MyValue1" }, "value2":{ "id": "200", "diaplayName": "MyValue2" } } } }
我想将Json字符串转换为以下类
class ValueSet { [JsonProperty("id")] public string id { get; set; } [JsonProperty("values")] public List values { get; set; } } class Value { public string id { get; set; } public string DiaplayName { get; set; } }
我的反序列化代码是
JavaScriptSerializer js = new JavaScriptSerializer(); StreamReader sr = new StreamReader(@"ValueSetJsonString.txt"); string jsonString = sr.ReadToEnd(); var items = JsonConvert.DeserializeObject(jsonString);
但序列化后我得到空值,我怎么能解决这个问题呢?
正如其他人已经指出的那样,您没有得到预期结果的原因是因为您的JSON与您尝试反序列化的类结构不匹配。 您需要更改JSON或更改类。 由于其他人已经展示了如何更改JSON,我将采取相反的方法。
要匹配您在问题中发布的JSON,您的类应定义如下。 请注意,我做了以下更改:
- 我在JSON中添加了一个与外部对象相对应的
Wrapper
类。 - 我将
ValueSet
类的Values
属性从List
更改为Dictionary
因为JSON中的values
属性包含一个对象,而不是一个数组。 - 我添加了一些额外的
[JsonProperty]
属性来匹配JSON对象中的属性名称。
类定义:
class Wrapper { [JsonProperty("JsonValues")] public ValueSet ValueSet { get; set; } } class ValueSet { [JsonProperty("id")] public string Id { get; set; } [JsonProperty("values")] public Dictionary Values { get; set; } } class Value { [JsonProperty("id")] public string Id { get; set; } [JsonProperty("diaplayName")] public string DisplayName { get; set; } }
您需要反序列化到Wrapper
类,而不是ValueSet
类。 然后,您可以从Wrapper
获取ValueSet
。
var valueSet = JsonConvert.DeserializeObject(jsonString).ValueSet;
这是一个工作程序来演示:
class Program { static void Main(string[] args) { string jsonString = @" { ""JsonValues"": { ""id"": ""MyID"", ""values"": { ""value1"": { ""id"": ""100"", ""diaplayName"": ""MyValue1"" }, ""value2"": { ""id"": ""200"", ""diaplayName"": ""MyValue2"" } } } }"; var valueSet = JsonConvert.DeserializeObject(jsonString).ValueSet; Console.WriteLine("id: " + valueSet.Id); foreach (KeyValuePair kvp in valueSet.Values) { Console.WriteLine(kvp.Key + " id: " + kvp.Value.Id); Console.WriteLine(kvp.Key + " name: " + kvp.Value.DisplayName); } } }
这是输出:
id: MyID value1 id: 100 value1 name: MyValue1 value2 id: 200 value2 name: MyValue2
https://json2csharp.com/
我发现上面的链接非常有用,因为它通过从实际返回的JSON生成它们来纠正我的C#类。
然后我打电话给:
JsonConvert.DeserializeObject(jsonString);
一切都按预期工作。
您的数据结构和JSON不匹配。
你的JSON是这样的:
{ "JsonValues":{ "id": "MyID", ... } }
但是您尝试将其序列化的数据结构是:
class ValueSet { [JsonProperty("id")] public string id { get; set; } ... }
您正在跳过一个步骤:您的JSON是一个具有一个名为JsonValues
属性的类,它具有ValueSet
数据结构的对象作为值。
在你的class级里面你的JSON是这样的:
"values": { ... }
您的数据结构如下:
[JsonProperty("values")] public List values { get; set; }
请注意,JSON中的{ .. }
定义了一个对象,其中[ .. ]
定义了一个数组。 因此,根据您的JSON,您没有一堆值,但是您有one
值对象,其属性值为value1
, value2
为Value
类型。
由于反序列化器需要一个数组而不是获取一个对象,因此它可以做的事情是最少的非破坏性(Exception):跳过该值。 您的属性values
保留其默认值: null
。
如果可以:调整您的JSON。 以下内容符合您的数据结构,很可能是您真正想要的:
{ "id": "MyID", "values": [ { "id": "100", "diaplayName": "MyValue1" }, { "id": "200", "diaplayName": "MyValue2" } ] }
你检查过这条线是否完美,你的字符串有价值吗?
string jsonString = sr.ReadToEnd();
如果是,请尝试使用此代码进行最后一行:
ValueSet items = JsonConvert.DeserializeObject
或者如果你有一个json数组,你可以使用这样的列表:
List
祝好运
你有一个不匹配的jSon字符串,如果你想转换成一个列表,试试这个
{ "id": "MyID", "values": [ { "id": "100", "diaplayName": "MyValue1", }, { "id": "200", "diaplayName": "MyValue2", } ] }
这也是可能的:
using System.Web.Helpers; var listOfObjectsResult = Json.Decode>(JsonData);
您可以使用Json.Net框架来执行此操作。 像这样 :
Account account = JsonConvert.DeserializeObject
主页: http : //json.codeplex.com/
关于这个的文件: http : //james.newtonking.com/json/help/index.html#
上述就是C#学习教程:如何将Json数组转换为c#中的对象列表分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1029440.html