如何检索路径为动态的属性的json值



如何在以下JSON中获取"full_name_ac":-

{
    "rows": 10,
    "os": "0",
    "page": "1",
    "total": "1",
    "peoples": {
        **"123":** {
            "url": "http://google.com",
            **"id": "123",**
            "fname": "Rob",
            "lname": "Tom",
            "full_name_ac": "Rob Tom"
        }
    }
}

我无法创建模型,因为模型总是会根据"id"进行更改。

我正在尝试类似的方法,但不确定如何获得full_name_ac 的值

JObject obj = JObject.Parse(data);

我建议您考虑使用JSONPath并使用SelectTokens:

JObject obj = JObject.Parse(data);
var names = obj.SelectTokens("$.peoples.*.full_name_ac");
var allNamesAsCsv = String.Join(",", names.Values<string>()); 

当然,如果你总是知道总会有一个,你可以使用SelectToken:

var onlyMatchObject = obj.SelectToken("$.peoples.*.full_name_ac");
var onlyMatch = first.Value<string>();

使用Json.Net。尝试使用dyanamic

dynamic stuff = JsonConvert.DeserializeObject(YOUR-JSON_STRING);
string name = stuff.peoples.123.full_name_ac;

请参阅此链接了解更多信息:将JSON反序列化为C#动态对象?

模型总是会根据"id"进行更改。

如果您的模型总是更改,那么您必须创建一个包含idstring的模型String对象是字段的json字符串。这样你就可以检查Id和它的模型字段。因此您可以将这些字段与json进行比较。

"field" :
{
    "id" : 123
    "fields" : 
    {
        "fname":"string",
        "full_name_ac":"string"
    }
}

创建类似上面的json,并将这个json包含在json中。当您反序列化主json时,您可以比较字段。我想从上面你会得到一些基本的想法。

如果你的模型是动态的,那么只有一个选项,即你有创建一个类似上面的json,其中包含字段。这样你就可以将这些字段与实际的json值进行比较。

也许您可以使用Regex和一些基本的文本解析来识别"full_name_ac"属性,并减去该值,类似于:

// just an example, untested
string jsonText = "{...}";
int startIndex = jsonText.indexOf(@"""full_name_ac"":");
int stopIndex = jsonText.indexOf(startIndex, "}");
string value = jsonText.substring(startIndex, stopIndex);

获取反序列化对象所需令牌的值(在您的例子中,obj.peoples的第一个令牌为"123",第一个令牌"123"是具有所需属性的对象),并从中获取所需属性,即full_name_ac。

        dynamic obj = JObject.Parse(jsonText);
        var value = obj.peoples;
        var tokenPeople = ((Newtonsoft.Json.Linq.JContainer)obj.peoples).First.First;
        string peopleJson =tokenPeople.ToString();
        dynamic people = JObject.Parse(peopleJson);
        string full_name_ac = people.full_name_ac;

下面一行将帮助您获得full_name_ac的值

var full_name_ac = obj.SelectToken("peoples.123.full_name_ac").ToString();

使用JObject.Parse(jsonString)AND获取First元素

// Id is dynamic , so parse and get first element
string dynamicName = (string)JObject.Parse(data)["peoples"].Children().First().Children().First()["full_name_ac"];

最新更新