将 Newtonsoft.Json.Linq.JArray 转换为特定对象类型的列表
Posted
技术标签:
【中文标题】将 Newtonsoft.Json.Linq.JArray 转换为特定对象类型的列表【英文标题】:Convert Newtonsoft.Json.Linq.JArray to a list of specific object type 【发布时间】:2012-11-13 22:52:37 【问题描述】:我有以下Newtonsoft.Json.Linq.JArray
类型的变量。
properties["Value"] [
"Name": "Username",
"Selected": true
,
"Name": "Password",
"Selected": true
]
我想要完成的是将其转换为List<SelectableEnumItem>
,其中SelectableEnumItem
是以下类型:
public class SelectableEnumItem
public string Name get; set;
public bool Selected get; set;
我对编程比较陌生,我不确定这是否可行。任何有关工作示例的帮助将不胜感激。
【问题讨论】:
【参考方案1】:使用IList获取JArray计数并使用Loop转换成List
var array = result["items"].Value<JArray>();
IList collection = (IList)array;
var list = new List<string>();
for (int i = 0; i < collection.Count; j++)
list.Add(collection[i].ToString());
【讨论】:
【参考方案2】:在我的例子中的API返回值如下所示:
"pageIndex": 1,
"pageSize": 10,
"totalCount": 1,
"totalPageCount": 1,
"items": [
"firstName": "Stephen",
"otherNames": "Ebichondo",
"phoneNumber": "+254721250736",
"gender": 0,
"clientStatus": 0,
"dateOfBirth": "1979-08-16T00:00:00",
"nationalID": "21734397",
"emailAddress": "sebichondo@gmail.com",
"id": 1,
"addedDate": "2018-02-02T00:00:00",
"modifiedDate": "2018-02-02T00:00:00"
],
"hasPreviousPage": false,
"hasNextPage": false
项目数组到客户列表的转换如下所示:
if (responseMessage.IsSuccessStatusCode)
var responseData = responseMessage.Content.ReadAsStringAsync().Result;
JObject result = JObject.Parse(responseData);
var clientarray = result["items"].Value<JArray>();
List<Client> clients = clientarray.ToObject<List<Client>>();
return View(clients);
【讨论】:
感谢这对我在 C# 中使用动态对象有用【参考方案3】:using Newtonsoft.Json.Linq;
using System.Linq;
using System.IO;
using System.Collections.Generic;
public List<string> GetJsonValues(string filePath, string propertyName)
List<string> values = new List<string>();
string read = string.Empty;
using (StreamReader r = new StreamReader(filePath))
var json = r.ReadToEnd();
var jObj = JObject.Parse(json);
foreach (var j in jObj.Properties())
if (j.Name.Equals(propertyName))
var value = jObj[j.Name] as JArray;
return values = value.ToObject<List<string>>();
return values;
【讨论】:
您还可以使用 JsonProperty 注释并将您的 JSON 对象反序列化为列表。public class SelectableEnumItem [JsonProperty("Name")] public string Name get; set; [JsonProperty("Selected")] public bool Selected get; set; public IList<SelectableEnumItem> GetListOfObject(string jsonTextHere) return JsonConvert.DeserializeObject<List<SelectableEnumItem>>(jsonTextHere);
【参考方案4】:
我可以想到不同的方法来实现相同的目标
IList<SelectableEnumItem> result= array;
或者(我有一些情况,这个不好用)
var result = (List<SelectableEnumItem>) array;
或使用 linq 扩展
var result = array.CastTo<List<SelectableEnumItem>>();
或
var result= array.Select(x=> x).ToArray<SelectableEnumItem>();
或更明确地
var result= array.Select(x=> new SelectableEnumItemFirstName= x.Name, Selected = bool.Parse(x.selected) );
请注意上面的解决方案我使用了动态对象
我可以想到一些更多的解决方案,它们是上述解决方案的组合。但我认为它涵盖了几乎所有可用的方法。
我自己用第一个
【讨论】:
您没有使用任何动态对象。您只使用了强类型对象。请查看 CLR 和 DLR 以了解两者之间的差异。【参考方案5】:问题中的示例是一个更简单的情况,其中属性名称在 json 和代码中完全匹配。如果属性名称不完全匹配,例如json中的属性为"first_name": "Mark"
,代码中的属性为FirstName
,然后使用Select method如下
List<SelectableEnumItem> items = ((JArray)array).Select(x => new SelectableEnumItem
FirstName = (string)x["first_name"],
Selected = (bool)x["selected"]
).ToList();
【讨论】:
先生,此代码从我的响应中获取第一个值,但我有很多值如何获取所有值。但我只需要获取一个值,我的意思是响应中有名字和姓氏。我只想得到名字,我该怎么做?【参考方案6】:只需调用array.ToObject<List<SelectableEnumItem>>()
方法。它会返回你需要的东西。
文档:Convert JSON to a Type
【讨论】:
确保您的类定义包含无参数构造函数。 那么如果数组有空字段怎么处理呢?这次我收到错误 JsonSerializationException。我想要数据,并且我希望它对于任何空数据都保持为空。 @nsarchar 你检查过你的属性是否可以为空吗? @realPro 刚刚为我工作。您确定您有一个数组并且该 JArray 中的 JObject 可以正确映射吗? 如果您不小心使用了非泛型JsonConvert.DeserializeObject(value)
而不是 JsonConvert.DeserializeObject<T>(value)
,您也会看到此错误以上是关于将 Newtonsoft.Json.Linq.JArray 转换为特定对象类型的列表的主要内容,如果未能解决你的问题,请参考以下文章
Javascript 将正则表达式 \\n 替换为 \n,将 \\t 替换为 \t,将 \\r 替换为 \r 等等