【问题标题】:How can I retrieve a json value to a property whose path is dynamic如何将 json 值检索到路径为动态的属性中
【发布时间】:2016-03-28 06:50:54
【问题描述】:

如何在以下 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);

【问题讨论】:

标签: c# json asp.net-mvc json.net


【解决方案1】:

我建议你看看使用JSONPath(s) and use 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>();

【讨论】:

    【解决方案2】:

    使用Json.Net。尝试使用dyanamic

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

    查看此链接了解更多信息:Deserialize JSON into C# dynamic object?

    模型总是会根据“id”而改变。

    如果您的模型总是在变化,那么您已经创建了一个包含 idstring 的模型。 String 对象是一个 json 字段字符串。这样您就可以检查 Id 及其模型字段。因此您可以将该字段与 json 进行比较。

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

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

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

    【讨论】:

    • OP提到模型可能会发生变化。
    【解决方案3】:

    也许您可以使用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);
    

    【讨论】:

    • 如果可能,最好避免使用正则表达式。如果它后面不再跟一个 '}' 但后面跟着另一个值会怎样?
    • 它不是最优雅的解决方案,但如果模型是完全动态的(似乎并非如此),则该解决方案很好。无论如何,你要么得到一个逗号 , 要么一个花括号,所以它仍然可能,但需要一些测试
    【解决方案4】:

    获取反序列化对象的所需令牌的值(在您的情况下,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;
    

    【讨论】:

      【解决方案5】:

      以下行将帮助您获得 full_name_ac

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

      【讨论】:

        【解决方案6】:

        使用 JObject.Parse(jsonString) 并获取第一个元素

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

        【讨论】:

        • 型号可能会发生变化。
        猜你喜欢
        • 2011-01-24
        • 2021-01-14
        • 2013-12-24
        • 1970-01-01
        • 1970-01-01
        • 2013-09-24
        • 2013-06-16
        • 2020-05-14
        • 2020-01-06
        相关资源
        最近更新 更多