c# - 验证值是否存在于具有相同键名称的 Json 数组中
问题描述
我有这个 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:
Davig G 的回答帮助我解决了问题,能够通过以下方式验证我的输入
if(data.Any(f => f.Name == "Kevin"))
{
Console.WriteLine("Kevin exists in the data");
}
我正在从 Get_Json() 方法返回字典列表使用 DavigG 的答案,我能够验证和访问列表中的特定键和值。
解决方案
处理具体类比处理纯 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);
推荐阅读
- json - 如何创建 JSON 文件结构,然后使用 bash 输出通过 jq 填充
- reactjs - 试图改变这个的背景颜色
datepicker material-UI 组件(提供 CodeSandbox) - docker - 如何在 Windows 10 中使用 Docker 中的 thenets/parsoid 将本地文本文件转换为 html?
- javascript - 验证+提交后反应输入值从定义变为未定义
- java - 更改代理和脚本库的默认 Java 版本
- c - 释放单链表的内存时出现无效的 free() 错误
- vim - Vim,映射非标准键(前进/后退/放大/缩小/收藏夹)
- windows - 用于从子文件夹和子文件夹中的文件中删除破折号的 Windows 批处理脚本
- regex - Fluent-Bit 是如何提取日志时间的,并且仍然保留原始日志时间的输出?
- python - 在 Tk.Canvas 中制作新的 Pillow 图像时,为什么数组有效但变量无效?