将json对象引用到字符串

时间:2017-01-19 09:25:48

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

我正在使用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."
                ]
            }
        }
    }
}

因此,当我创建一个这样的动态变量并将firstname分配给string时,我得到一个RuntimebinderException。

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

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

3 个答案:

答案 0 :(得分:3)

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

此外,由于您的JSON包含一个名为data的根对象,因此您似乎也错过了(因为您也将变量命名为data,可能会让您感到困惑)。

我会选择:

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

显然,如果你掌控了返回的JSON,你可以将它重构为更容易消费的东西:

"FirstName": "Lacy",

此外,您可以使用原始dynamic访问您的数据来完全避免JObject

var firstName = JObject.Parse(json).SelectToken("data.attributes.data.Firstname[0]").ToString();

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

答案 1 :(得分:1)

首先,你的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."
            ]
        }
    }
}
}

FirstName是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."

        }
    }
}
}

如果你将它反序列化为课程。然后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;

答案 2 :(得分:0)

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