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

uyto3xhc  于 2023-01-22  发布在  其他
关注(0)|答案(3)|浏览(100)

我正在使用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;

我是不是忘了什么?

gwbalxhn

gwbalxhn1#

从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

polhcujo

polhcujo2#

首先,您的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.,那么Data2类就像这样。

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;
du7egjpx

du7egjpx3#

如果有办法修改你的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."
      }
    }
  }
}

也可以像他回答中提到的@haim770那样不修改json就可以访问。

相关问题