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

验证具有相同键名的JSON数组中是否存在值

  •  3
  • AutoTester213  · 技术社区  · 6 年前

    我有这个JSON尸体

    [
        {
            "Id": 1,
            "Name": "John",
            "Icon": "Icon/someplace",
            "SortOrder": 1
        },
        {
            "Id": 2,
            "Name": "Jessica",
            "Icon": "Icon/someplace",
            "SortOrder": 1
        },
        {
            "Id": 3,
            "Name": "Kevin",
            "Icon": "Icon/someplace",
            "SortOrder": 1
        },
        {
            "Id": 4,
            "Name": "Lint",
            "Icon": "Icon/someplace",
            "SortOrder": 1
        },
        {
           ...
        }
    ]
    

    我正在通过API向JSON添加值,我需要验证新值是否存在于JSON主体中。

    我试图隐藏对JSON的反应,

    public object Get_Json()
    {
        var response = GEt_Json_Body();
        var json_string = JsonConvert.SerializeObject(response);
        JArray UpdatedContent = JArray.Parse(json_string);
        JObject Facility_Json = JObject.Parse(UpdatedContent[0].ToString());
        Assert.NotNull(Facility_Json);
        return Facility_Json;
    }
    

    这只会返回第一个JSON:

    {
        "Id": 1,
        "Name": "John",
        "Icon": "Icon/someplace",
        "SortOrder": 1
    }
    

    UpdatedContent[i] 我允许我在数组中获取其他JSON,问题是我不知道我使用API创建的JSON将放在哪里,如何获取所有jarray并验证我的条目是否在那里?

    更新:

    这是我的电话:

    public List<FooModel> Get_Json_Body()
    {
        var request = new RestRequest();
        request.Resource = string.Format("/api/get_something");
    
        return Execute<FooMedl>(request, Endpoint);
    }
    
    public  class FooModel
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Icon { get; set; }
        public int SortOrder { get; set; }
    }
    
    
    public List<T> Execute<T>(RestRequest request, string Endpoint) where T : new()
    {
    
        Client.BaseUrl = new Uri(Endpoint);
    
        var response = Client.Execute<List<T>>(request);
    
        Console.WriteLine(response.ResponseUri);
    
        if (response.ErrorException != null)
        {
            string message = String.Format("Error retrieving response: \n{0} \n{1}  \n{2}  ",
                response.Content, response.ErrorMessage, response.ErrorException);
    
            Console.WriteLine(message);
    
            var exception = new ApplicationException(message);
            throw exception;
        }
        return Response.Data;
    }
    

    更新2:

    戴维格的回答帮助我解决了这个问题,并通过

    if(data.Any(f => f.Name == "Kevin"))
    {
        Console.WriteLine("Kevin exists in the data");
    }
    

    我正在使用davigg的答案从get json()方法重新获取字典列表,我能够验证和访问列表中的特定键和值。

    1 回复  |  直到 6 年前
        1
  •  2
  •   DavidG    6 年前

    与纯JSON对象相比,处理具体类要容易得多,我建议将JSON直接反序列化为以下对象列表:

    public class Foo
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Icon { get; set; }
        public int SortOrder { get; set; }
    }
    

    要反序列化的代码是:

    var data = JsonConvert.DeserializeObject<List<Foo>>(response);
    

    现在,您可以随意处理该对象,例如:

    if(data.Any(f => f.Name == "Kevin"))
    {
        Console.WriteLine("Kevin exists in the data");
    }
    

    或者甚至修改:

    var kevin = data.SingleOrDefault(f => f.Name == "Kevin");
    if(kevin != null)
    {
        kevin.SortOrder = 3;
    }
    

    然后,如果您需要它返回到最初的JSON:

    var json = JsonConvert.SerializeObject(data);