【问题标题】:Convert Newtonsoft.Json.Linq.JArray to a list of specific object type将 Newtonsoft.Json.Linq.JArray 转换为特定对象类型的列表
【发布时间】: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; }
    }

我对编程比较陌生,我不确定这是否可行。任何有关工作示例的帮助将不胜感激。

【问题讨论】:

    标签: c# json.net


    【解决方案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&lt;SelectableEnumItem&gt; GetListOfObject(string jsonTextHere) { return JsonConvert.DeserializeObject&lt;List&lt;SelectableEnumItem&gt;&gt;(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 SelectableEnumItem{FirstName= 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&lt;List&lt;SelectableEnumItem&gt;&gt;() 方法。它会返回你需要的东西。

      文档:Convert JSON to a Type

      【讨论】:

      • 确保您的类定义包含无参数构造函数。
      • 那么如果数组有空字段怎么处理呢?这次我收到错误 JsonSerializationException。我想要数据,并且我希望它对于任何空数据都保持为空。
      • @nsarchar 你检查过你的属性是否可以为空吗?
      • @realPro 刚刚为我工作。您确定您有一个数组并且该 JArray 中的 JObject 可以正确映射吗?
      • 如果您不小心使用了非泛型 JsonConvert.DeserializeObject(value) 而不是 JsonConvert.DeserializeObject&lt;T&gt;(value),您也会看到此错误
      猜你喜欢
      • 2016-02-10
      • 1970-01-01
      • 2021-07-21
      • 2019-04-10
      • 2015-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      相关资源
      最近更新 更多