正在分析未知JSON对象以查找特定值



我的问题是,我试图解析一个未知的json块,并查找特定属性的值。我有特定财产的路径和名称,这就是我所知道的全部。

假设我的JSON是这样的:

{
"firstName": "John",
"lastName": "Smith",
"age": 25,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": 10021
},
}

用户会将字符串address.city传递给我,并期望返回字符串New York。但是,请记住,我一开始对对象没有任何了解,所以我不能简单地将JSON直接解析到已知的对象容器中。

以下是我使用JSON.NET所做的尝试。注意,我并没有接受这个解决方案,我只想要一个解决问题的解决方案。

string propertyName = "address.city";
string responseBody= // assume JSON above is here properly formatted
JObject parsedResponseBody = JObject.Parse(responseBody);
string[] parsedPropertyName = propertyName.Split('.');
var foundValue = parsedResponseBody.GetValue(parsedPropertyName[0]);
for (int index = 1; index < parsedPropertyName.Count(); index++)
{
foundValue = foundValue.getValue(parsedPropertyName[index]);
}

不幸的是,这失败了,因为第一个GetValue()返回的是JToken,而不是我所希望的另一个JObject,而且我在文档中找不到可以专门访问特定属性的地方,只有批量JSON。

或者,在JSON.NET文档中,"查询JSON"示例看起来可以解决我的问题,只是我不知道如何从其字符串表示生成类似blogPost.Author.Name的内容。

提前感谢您的帮助。

编辑:好吧,所以从一些答案来看,我在最初的帖子中不够清楚。响应JSON对象不仅是未知的,而且我不能依赖于propertyName字段只有两部分。它可以是类似于"prop1.prop2.prop3.prop4"的东西,也可以像"prop1"一样简单。

您可以尝试以下示例:

var jObj = JObject.Parse(jsonString);
var token = jObj.SelectToken(propertyName);

假设jsonString变量是任何json字符串,propertyName是您想要获得的任何路径。

以下是我用来枚举JSON字符串中键的一些代码:

private Dictionary<string, object> JSONToDictionary(string jsonString)
{
var jObj = (JObject)JsonConvert.DeserializeObject(jsonString);
var dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(jObj.ToString());
return dict;
}

然后在你的代码中:

foreach (KeyValuePair<string, object> kvp in JSONToDictionary("{ "some": "jsonfile" }"))
{
// (kvp.Key == "some") = true
// ((kvp.Value as string) == "jsonfile") = true
}
IDictionary<string, JToken> Jsondata = JObject.Parse(yourJsonString);
foreach (KeyValuePair<string, JToken> element in Jsondata) {
string innerKey = element.Key;
if (element.Value is JArray) {
// Process JArray
}
else if (element.Value is JObject) { 
// Process JObject
}
}

相关内容

  • 没有找到相关文章

最新更新