将 json 对象引用到字符串时出现 RuntimeBinderException

RuntimeBinderExeption when refering json object to string

我正在使用 Newtonsoft.Json 反序列化我的 json。这是我的 json 字符串。

{
    "data": {
        "type": "records",
        "id": "7",
        "attributes": {
            "created": "2017-01-19T08:42:56Z",
            "updated": "2017-01-19T08:42:56Z",
            "state": 3,
            "data": {
                "Lastname": [
                    "Gonzales"
                ],
                "Firstname": [
                    "Lacy"
                ],
                "Email": [
                    "ludam@gmail.com"
                ],
                "Salutation": [
                    "Mrs."
                ]
            }
        }
    }
}

因此,当我像这样创建一个动态变量并将名字分配给字符串 s 时,我得到了一个 RuntimebinderException。

dynamic data = JsonConvert.DeserializeObject(responseString2);
string s = data.attributes.data.Firstname;

有什么我忘了的吗?感谢您的帮助

根据您的 JSON 结构判断,Firstname 实际上是一个包含单个项目的数组。

此外,由于您的 JSON 包含一个名为 data 的根对象,您似乎也遗漏了它(可能会造成混淆,因为您也将变量命名为 data ).

我会选择:

dynamic result = JsonConvert.DeserializeObject(responseString2);
string s = result.data.attributes.data.Firstname[0];

显然,如果您控制返回的 JSON,您可以将其重构为更容易使用的东西:

"FirstName": "Lacy",

此外,您可以通过使用原始 JObject:

访问您的数据来完全避免 dynamic
var firstName = JObject.Parse(json).SelectToken("data.attributes.data.Firstname[0]").ToString();

有关更多选项,请参阅 LINQ to JSON

如果可以更改您的 json,请删除名字中的 [],依此类推,如下所示。然后就可以访问值了。

    "data": {
    "type": "records",
    "id": "7",
    "attributes": {
      "created": "2017-01-19T08:42:56Z",
      "updated": "2017-01-19T08:42:56Z",
      "state": 3,
      "data": {
        "Lastname":"Gonzales",
        "Firstname":"Lacy",
        "Email":"ludam@gmail.com",
        "Salutation":"Mrs."
      }
    }
  }
}

或者您可以在不更改 json 的情况下访问,就像他的回答中提到的 @haim770 一样。

首先,您的json似乎不​​正确。

正确Json:

{
"data": {
    "type": "records",
    "id": "7",
    "attributes": {
        "created": "2017-01-19T08:42:56Z",
        "updated": "2017-01-19T08:42:56Z",
        "state": 3,
        "data": {
            "Lastname": [
                "Gonzales"
            ],
            "Firstname": [
                "Lacy"
            ],
            "Email": [
                "ludam@gmail.com"
            ],
            "Salutation": [
                "Mrs."
            ]
        }
    }
}
}

名字是 List<string>,而不是 string

List<string> ls =  obj.data.attributes.data.Firstname;

因为Data2将被序列化为。

public class Data2
    {
        public List<string> Lastname { get; set; }
        public List<string> Firstname { get; set; }
        public List<string> Email { get; set; }
        public List<string> Salutation { get; set; }
    }

再提一个建议。

我觉得如果Data2只属于一个persion,那你得改一下json结构

{
"data": {
    "type": "records",
    "id": "7",
    "attributes": {
        "created": "2017-01-19T08:42:56Z",
        "updated": "2017-01-19T08:42:56Z",
        "state": 3,
        "data": {
            "Lastname": "Gonzales",
            "Firstname": "Lacy",
            "Email": "ludam@gmail.com",
            "Salutation": "Mrs."

        }
    }
}
}

并且如果将其反序列化为 class。那么Data2class就是这样

public class Data2
    {
        public string Lastname { get; set; }
        public string Firstname { get; set; }
        public string Email { get; set; }
        public string Salutation { get; set; }
    }

然后你可以做,你现在在做什么。

string  firstName =  obj.data.attributes.data.Firstname;