C#在Newtonsoft JSON.Net中搜索属性并返回其值

时间:2018-02-14 13:17:06

标签: c# json properties json.net

我无法将数据序列化为C#对象,因为对于同一组对象,JSON的结构不同。是否有某种函数可以让您搜索所有JSON属性及其子属性,以便返回您搜索的属性的值?

我通过API接收的数据示例(我试图返回属性值" propertyIamLookingFor"):

第一个例子

{"widget": {
    "debug": "on",
    "window": {
        "title": "Sample Konfabulator Widget",
        "name": "main_window",
        "propertyIamLookingFor": 500,
        "height": 500
    },
    "image": { 
        "src": "Images/Sun.png",
        "name": "sun1",
        "hOffset": 250,
        "vOffset": 250,
        "alignment": "center"
    }
}} 

第二个例子

{"widget": {
    "debug": "on",
    "window": {
        "title": "Sample Konfabulator Widget",
        "name": "main_window",
        "height": 500
    },
    "image": { 
        "src": "Images/Sun.png",
        "name": "sun1",
        "hOffset": 250,
        "vOffset": 250,
        "alignment": "center"
    },
    "propertyIamLookingFor": 32
}}

第三个例子

{"widget": {
    "debug": "on",
    "window": {
        "title": "Sample Konfabulator Widget",
        "name": "main_window",
        "height": 500
    },
    "image": { 
        "src": "Images/Sun.png",
        "name": "sun1",
        "hOffset": 250,
        "vOffset": 250,
        "window": {
            "title": "Sample Konfabulator Widget",
            "name": "main_window",
            "height": 500,
            "propertyIamLookingFor": 11
        }
    }
}} 

请注意,无论其位置如何,该属性始终具有相同的名称,因此我知道该属性的名称,并且我试图返回该值。

*如果有人想知道,这是我访问的一个糟糕的API,但没有选择不使用它。

2 个答案:

答案 0 :(得分:1)

您可以使用JSONPath,它与XPath类似。

例如,要查找名为myProp的所有属性,请使用JSONPath表达式

$..myProp

这是一个递归选择器,它将迭代所有属性和子道具等。

JSONPath内置于json.net库

再看看http://newtonsoft.com/json/help/html/QueryJsonSelectTokenJsonPath.htm但深入挖掘:)

答案 1 :(得分:0)

我没有设法在JSON.Net中找到一个函数来查找属性(无论JSON结构中的位置如何)并返回其值,但XmlDocument.GetElementsByTagName在XML中运行良好。所以我只是用JsonConvert.DeserializeXmlNode将JSON转换为XML,然后使用XmlDocument.GetElementsByTagName来查找我的属性。希望它可以帮助其他人解决同样的问题,并希望其他人发布更简单的方法来实现这一目标。

编辑: Charleh设法指出了JSON的方式,被接受为最佳答案