【问题标题】:RuntimeBinderExeption when refering json object to string将 json 对象引用到字符串时出现 RuntimeBinderException
【发布时间】:2017-01-19 09:25:47
【问题描述】:

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

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

【问题讨论】:

    标签: c# json json.net json-deserialization


    【解决方案1】:

    从您的 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

    【讨论】:

      【解决方案2】:

      首先,您的 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只属于一个人,那么你必须改变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."
      
              }
          }
      }
      }
      

      如果您将其反序列化为类。那么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;
      

      【讨论】:

        【解决方案3】:

        如果有办法更改您的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 的情况下访问。

        【讨论】:

          猜你喜欢
          • 2013-02-07
          • 1970-01-01
          • 1970-01-01
          • 2017-07-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多