我正在使用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;
我忘记了什么吗?感谢您的帮助
答案 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
的情况下访问。