繁体   English   中英

如何遍历json对象中的项目并检索C#中的特定值?

[英]How do I iterate through items in a json object and retrieve a specific value in C#?

我有一个json字符串,我想对其进行迭代以检索特定值。 在此对象中,有多个项目,每个项目具有相同的元素。 我想做的是在每个项目中搜索其request_item.u_requested_for.user_name,并将其与另一个值进行比较。 如果不匹配,请继续。 如果确实匹配,那么我想检索request_item.u_requested_for.sys_id值。 此外,json的大小将不会总是相同。 有时会有5个元素,而其他时候是20个。我如何遍历每个项目,进行比较,然后检索所需的其他值?

我已经使用我发现的其他想法来解决这个问题,但是我无法真正使其发挥作用。 首先,我应该使用JObject.Parse()将字符串解析为一个对象吗? 还是应该继续将其作为字符串使用?

我尝试使用JsonTextReader来读取每一行,但是我不确定一旦找到符合条件的项目该如何检索需要的值。

{
    "result": [
        {
            "request_item.sys_id": "db6e3306dbc3ef8c791a777a8c961986",
            "request_item.u_requested_for.sys_id": "8416ccb3dba9df8c1ddee3a84b961911",
            "request_item.u_requested_for.user_name": "H298956"
        },
        {
            "request_item.sys_id": "e5990f89db47ebc8bd663ebd7c96198f",
            "request_item.u_requested_for.sys_id": "878ce1d5dbcd0300cc78dd0b5e961987",
            "request_item.u_requested_for.user_name": "E092733"
        },
        {
            "request_item.sys_id": "87970c08db4be388791a777a8c9619ee",
            "request_item.u_requested_for.sys_id": "484a1cf5db5f83c04f6489584b961952",
            "request_item.u_requested_for.user_name": "H281111"
        }
    ]
}

在这种情况下,我要遍历每个项目并寻找值“ H281111”。 找到该值后,我想提取“ request_item.u_requested_for.sys_id值”,在这种情况下为“ 484a1cf5db5f83c04f6489584b961952”。

根据您的要求,您可能需要比Michaël更快,更脏的解决方案。 如果此JSON字符串的内容在应用程序中的多个位置使用过,我敦促您按照他的建议编写类并适当地反序列化。 您会很高兴的。

但是,如果您只需要在一个地方从此JSON字符串中获得一个值,那么它将起作用。

var jobj = JObject.Parse(json);
var user_name = "H281111";

var sys_id = jobj["result"]
    .Where(r => (String)r["request_item.u_requested_for.user_name"] == user_name)
    .Select(r => (String)r["request_item.u_requested_for.sys_id"])
    .FirstOrDefault();

Elphas Tori建议使用?[]空条件元素访问 )运算符进行以下改进:

var sys_id2 = (string)jobj["result"]
    .FirstOrDefault(r =>(string)r["request_item.u_requested_for.user_name"] == user_name)
    ?["request_item.u_requested_for.sys_id"];

如果该LINQ代码对您来说看起来像胡言乱语,则可以使用更常规的循环方法:

foreach (var r in jobj["result"])
{
    //  etc.
}

我认为您应该在该Json文件中有一个代表对象的类,将Json文件反序列化为您的类,然后使用LINQ在对象列表中找到所需的对象。

结果将是requestItem的数组

请求项目将包含以下字段:

  • sys_id
  • u_requested_for(类)

请求的将具有以下字段:

  • sys_id
  • 用户名

您甚至可以幻想并使用其中包含sys_id的基类来节省一些时间。

您需要将此反序列化为POCO对象以对其进行迭代。 在这里,您可以找到如何实现它的示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM