代码之家  ›  专栏  ›  技术社区  ›  shockwave

搜索Json对象数组-列表vs字典

  •  0
  • shockwave  · 技术社区  · 8 年前

    我使用下面的代码反序列化了JsonResponse。

    var data = (JObject)JsonConvert.DeserializeObject(jsonResponse);
    

    我得到了如下响应字符串

    {  
       "results":[  
          {  
             "url":"tickets/2063.json",
             "id":20794,
             "subject":"Device not working",
             "created_date": "2018-01-10T13:03:23Z",
             "custom-fields":[  
                {  
                   "id":25181002,
                   "value":34534
                },
                {  
                   "id":2518164,
                   "value":252344
                }
             ]
          }
       ]
    }
    

    我的目标是读取这个json对象数组中的某些字段并插入到数据库中。我需要的字段是id、subject、created\u date、member\u id。

    成员id是自定义字段的一部分。member\u id是id=2518164的值。我用列表来存储这个,你能告诉我列表或字典是否更适合这种情况吗。如何实现字典

    var data = (JObject)JsonConvert.DeserializeObject(jsonResponse);
        var tickets = data["results"].ToList();
         foreach (var ticketItem in tickets){
            Int64? ticketFormId = ticketItem["id"].Value<Int64>();
            string subject = ticketItem["subject"].Value<string>();
            DateTime createdDate = ticketItem["created_date"].Value<DateTime>();
    
           //Do you think for the next step a dictionary is better or a List is better, since I want to search for a particular id=2518164
            var fieldsList = ticketItem["fields"].ToList();
            foreach(var fieldItem in fieldList){
                Int64? fieldId = fieldItem["id"].Value<Int64>();
                if(fieldId!=null && fieldId == 2518164){
                    memberId = fieldItem["value"].Value<string>();
                }
            }
     }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Xiaoy312    8 年前

    如果下一步要将它们全部插入数据库,只需将它们存储到列表中即可。字典只对按键搜索项目有用。

    您还可以使用linq以更简单的方式处理json:

    var tickets =   JObject.Parse(jsonResponse)["results"]
        .Select(ticket => new
        {
            Id = (long)ticket["id"],
            Subject = (string)ticket["subject"],
            CreatedDate = (DateTime)ticket["created_date"],
            MemberId = (long)ticket["custom-fields"]
                .FirstOrDefault(cf => (int)cf["id"] == 2518164)
                ?["value"],
        })
        .ToList();