Newtonsoft.Json.Linq.JArrayを特定のオブジェクトタイプのリストに変換する


236

次のタイプの変数があります{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; }
    }

私はプログラミングに慣れていないので、これが可能かどうかはわかりません。実例を参考にしていただければ幸いです。

回答:


480

array.ToObject<List<SelectableEnumItem>>()メソッドを呼び出すだけです。それはあなたが必要なものを返します。

ドキュメント:JSONを型に変換する


4
クラス定義にパラメータのないコンストラクタが含まれていることを確認してください。
ファウスト

1
では、配列にnullフィールドがある場合の処理​​方法は?今回はエラーJsonSerializationExceptionが発生します。データが必要ですが、nullデータの場合はnullのままにしておきます。
Ensar Turkoglu

1
@nsarcharプロパティがnull可能であることを確認しましたか?
Jannik 2018

@realProちょうど私のために働いた。配列があり、そのJArrayのJObjectsが適切にマップできることを確認しますか?
VSO

あなたが誤って非ジェネリックを使用する場合にも、このエラーが表示されますJsonConvert.DeserializeObject(value)の代わりにJsonConvert.DeserializeObject<T>(value)
チャドHedgcock

42

問題の例は、プロパティ名がjsonとコードで正確に一致する単純なケースです。プロパティ名が完全に一致しない場合、たとえばjsonのプロパティが一致し、"first_name": "Mark"コードのプロパティが次のようにSelectメソッドFirstName使用する場合

List<SelectableEnumItem> items = ((JArray)array).Select(x => new SelectableEnumItem
{
    FirstName = (string)x["first_name"],
    Selected = (bool)x["selected"]
}).ToList();

このコードは私の応答から最初の値を取得しますが、どのようにしてすべての値を取得できますか?それを行う ?
tpbafk 2017年

6

ここに示すように、私の場合の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
}

items配列からクライアントのリストへの変換は、次のように処理されました。

 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#で動的オブジェクトを使用するのに
Anthony McGrath

2

同じことを達成するための異なる方法を考えることができます

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) });

上記の解決策に注意してください私は動的オブジェクトを使用しました

上記のソリューションの組み合わせであるいくつかのソリューションを考えることができます。しかし、私はそれがそこにあるほとんどすべての利用可能な方法をカバーすると思います。

私は最初のものを使います


1
動的オブジェクトを使用していません。厳密に型指定されたオブジェクトのみを使用しました。CLRとDLRの違いを確認してください。
user1789573

2
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); }
Mohammed Hossen

1

IListを使用してJArrayカウントを取得し、ループを使用してリストに変換する

       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());             
            }                         
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.