我有一个响应的Jarray,并且在Jarray中有一个Clients数组,根据我需要在Array中选择对象的条件 杰森是
JArray response = JArray.Parse(@"[
{
'ProviderTransactionID': '4c4c5b43-0dd6-490c-9a59-062e25c04019',
'IsSuccess': 'False',
'ErrorMessages': 'Some error',
'ClientInfo': [
{
'InternalID': '98367',
'UniqueID': '',
'ErrorMessages': 'ERROR:'
},
{
'InternalID': '98368',
'UniqueID': '',
'ErrorMessages': 'ERROR:'
}
]
}
]");
例如,我需要选择ClientInfo对象,其中InternalID = 98367
但是
response.SelectToken("ClientInfo") returning null
response.SelectToken("ClientInfo") as JArray returning null
response.SelectTokens("ClientInfo") not returning any result
response.Children().Where(lst=>lst.SelectToken("ClientInfo").HasValues) is throwing Arg_PlatformNotSupported exception
response.SelectTokens("ClientInfo").Where(lst=>lst.Value<int>()==98367).FirstOrDefault() is returning null
有人可以帮助我如何获取响应数组中所有与ClientInfo对象匹配的ID吗?
答案 0 :(得分:5)
根据文档( https://www.newtonsoft.com/json/help/html/SelectToken.htm ),可能的解决方案可以是:
response.SelectTokens("$..ClientInfo[?(@.InternalID=='98367')]").ToList();
答案 1 :(得分:2)
您可以使用LINQ查询JSON,如下所示:
var Result = (from p in response
select new
{
Errors = (from z in p["ClientInfo"]
where (string)z["InternalID"] == "98368"
select new
{
InternalID = (string)z["InternalID"],
UniqueID = (string)z["UniqueID"],
ErrorMessages = (string)z["ErrorMessages"],
}).ToList()
}).ToList();
我们可以使用匿名类型。net将在内部创建类。 如果要使用父数据元素,请同时说ProviderTransactionID 下面的代码也适用于
var Result = (from p in response
select (from z in p["ClientInfo"]
where (int)z["InternalID"] == 98368
select new
{
ProviderTransactionID = (string)p["ProviderTransactionID"],
InternalID = (int)z["InternalID"],
UniqueID = (string)z["UniqueID"],
ErrorMessages = (string)z["ErrorMessages"],
}
).ToList()
).ToList();
答案 2 :(得分:0)
如果您不想使用课程,则需要这样的东西:
JArray jArray = JArray.Parse("[\r\n {\r\n 'ProviderTransactionID': '4c4c5b43-0dd6-490c-9a59-062e25c04019',\r\n 'IsSuccess': 'False',\r\n 'ErrorMessages': 'Some error',\r\n 'ClientInfo': [\r\n {\r\n 'InternalID': '98367',\r\n 'UniqueID': '',\r\n 'ErrorMessages': 'ERROR:'\r\n },\r\n {\r\n 'InternalID': '98368',\r\n 'UniqueID': '',\r\n 'ErrorMessages': 'ERROR:'\r\n }\r\n ]\r\n }\r\n ]");
const string internalId = "98367";
foreach (JToken obj in jArray)
{
IEnumerable<JToken> clientInfoObjects = obj.SelectToken("ClientInfo").Where(clientInfoJToken => clientInfoJToken["InternalID"].Value<string>() == internalId);
}
因此,由于要解析为JArray
,因此需要遍历对象(尽管在您的情况下只有一个)。
然后,您处于对象级别,因此可以使用.SelectToken("ClientInfo")
,它为您提供了一个JToken(JArray),使您可以使用.Where()
来过滤满足您要求的对象。
结果是一个IEnumerable<JToken>
,它将是具有您指定ID的ClientInfo对象。