将 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。那么Data2
class就是这样
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;
我正在使用 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。那么Data2
class就是这样
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;