【问题标题】:Parse JSON array in c# to read array collection inside json在 C# 中解析 JSON 数组以读取 json 中的数组集合
【发布时间】:2017-10-02 01:29:13
【问题描述】:

我有一个下面的 Jason 格式,其中声明将是一个数组集合,现在我需要从 c# 中读取与 policyid 相关的所有声明(这是下面 json 中的一个集合),谁能帮我解决它

{
                "ClaimList": [{
                                "Claims": ["CL8901"],
                                "PolicyID": "W1234sd",
                                "ClaimsCount": 1
                }, {
                                "Claims": ["CL3456", "CL1234"],
                                "PolicyID": "T1234sd",
                                "ClaimsCount": 2

                }, {
                                "Claims": ["CL1321"],
                                "PolicyID": "C1234sd",
                                "ClaimsCount": 1
                }]
}

【问题讨论】:

    标签: c# asp.net arrays json c#-3.0


    【解决方案1】:
    string json = Util.ReadLine<string>();
        JObject.Parse(json).SelectToken("ClaimList").Select(cl => new
        {
            PolicyId = cl.SelectToken("PolicyID"),
            Claims = cl.SelectToken("Claims").ToObject<List<string>>()
        }).Dump();
    

    Linqpad 代码 http://share.linqpad.net/vqoav5.linq

    【讨论】:

      【解决方案2】:

      要实现您的需要,请执行以下操作:

      1. 按照我的回答 here 为您的 json 创建 C# 类
      2. 使用NewtonSoft NuGet 库将 JSON 反序列化为 C# 对象
      3. 对反序列化的项目执行所需的任何处理

      完成上述操作后,以下是一些代码:

      var claims = JsonConvert.DeserializeObject<Rootobject>("YourJsonHere");
      IEnumerable<Claimlist> claimsForPolicy= 
          claims.ClaimList.Where(x => x.PolicyID == "whateverYouNeed");
      

      【讨论】:

        【解决方案3】:

        如果您可以使用 Json.NET 库 (NuGet),这非常简单。首先确保您有一个 Claim 类,该类在您的 JSON 中具有这些内部对象的结构:

        class Claim
        {
            public List<string> Claims { get; set; }
            public string PolicyID { get; set; }
            public int ClaimsCount { get; set; }
        }
        

        有了该类,您可以使用 Json.NET 执行以下操作:

        using Newtonsoft.Json;
        
        // ...
        
        string yourJson = getYourJsonStringSomehow();
        var claimsDict =
            JsonConvert.DeserializeObject<Dictionary<string, List<Claim>>>(yourJson);
        

        这将产生一个带有一个键的Dictionary:“ClaimsList”,其值将是您的Claim 对象的List

        var claimsList = claimsDict["ClaimsList"];
        var firstClaim = claimsList[0];
        Console.WriteLine(firstClaim.PolicyID);
        // Should print W1234sd
        

        【讨论】:

          【解决方案4】:

          你可以试试这个,首先让我们为你的 json 数据创建一个 Json 类:

          public class JsonDoc
          {
              //I am adding an index on constructor for looping purposes
              public JsonDoc(string json, int index)
              {
                  JObject jObject = JObject.Parse(json);
                  JToken jResult = jObject["ClaimList"];
                  Claims = jResult[index]["Claims"].ToObject<string[]>();
              }
          
              //This constructor will return the number of count under ClaimList node
              public JsonDoc(string json)
              {
                  JObject jObject = JObject.Parse(json);
                  JToken jResult = jObject["ClaimList"][0];
                  intCount = jResult.Count();
              }
          
              private string[] Claims { get; set; }
              public int intCount { get; set; }
          }
          

          然后要将这个类用于你的Json数据,首先添加Newtonsoft Json的引用。

          using Newtonsoft.Json.Linq;
          

          然后在您的示例数据上,我使用 StreamReader 通过文件读取所有数据,对其进行循环并将所有数据放在一个列表下:

          private static void Main(string[] args)
              {
                  using (StreamReader sr = new StreamReader(@"C:\Folder\myjson.json"))
                  {
                      string json = sr.ReadToEnd();
                      JsonDoc jSon = new JsonDoc(json);
          
                      //This will get the length of the array under ClaimList node
                      int intCount = jSon.intCount;
          
          
                      List<JsonDoc> lstResult = new List<JsonDoc>();
                      for (int x = 0; x < intCount; x++)
                      {
                          lstResult.Add(new JsonDoc(json, x));
                      }
                  }
              }
          

          结果是一个 JsonDoc 类列表,其中字符串数组作为属性的一部分。这个字符串数组是您的索赔节点上的结果。这个 JsonDoc 类包含属性 Claims,它是一个包含您的 Claims 节点的字符串数组:

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-23
            • 1970-01-01
            • 1970-01-01
            • 2014-08-21
            相关资源
            最近更新 更多