C# Newtonsoft Json反序列化错误
这是一个非常奇怪的错误。我有这些物品:C# Newtonsoft Json反序列化错误,c#,json,C#,Json,这是一个非常奇怪的错误。我有这些物品: public class Mobile_SettingModels { public string Token { get; set; } public SettingViewModels Setting { get; set; } } public class SettingViewModels { public string CompanyToken { get; set; } public string ApiKey
public class Mobile_SettingModels
{
public string Token { get; set; }
public SettingViewModels Setting { get; set; }
}
public class SettingViewModels
{
public string CompanyToken { get; set; }
public string ApiKey { get; set; }
public string Password { get; set; }
public int MarkRedAfter { get; set; }
}
我从Json响应中得到了以下响应:
{
"Token":"DEJkEKQpAUR3UvUc5ZFoYAO4vt3Cq4ErZOc/KeERRu0N+Pc/gzAQ538tMGALuxnKtangfEv81bZ7D3P3WdeUoE76KMveGqcP7JepYIL3EBxxxxxxxxxxxxxxxyyyyyyyyyyyyzzzzzzzzzzzzzzz==",
"Setting":
{
"CompanyToken":"xxxxxxxx",
"ApiKey":"AIzaSyAZ6bZ02BAd_zzzzzzzzzzzzzzzz",
"Password":null,
"MarkRedAfter":30
}
}
这就是我得到这个回答的原因
var values = new NameValueCollection() {
{ "token", myToken }
};
var result = Encoding.UTF8.GetString(client.UploadValues(uploadUrl, values));
var setting = JsonConvert.DeserializeObject<Mobile_SettingModels>(result);
var values=new NameValueCollection(){
{“token”,myToken}
};
var result=Encoding.UTF8.GetString(client.UploadValues(uploadUrl,values));
var设置=JsonConvert.DeserializeObject(结果);
每当我反序列化它时,setting.Token值都是正确的,但是setting.setting是一团乱
这里可能出了什么问题
更新 因此,当我调试它时,
var设置显然有:
背景
代币
>k__BackingField
>k__BackingField
这非常奇怪,因为我的对象上没有任何Serializable
属性。另外,我确信我得到的响应没有Serializable
属性,因为否则结果中将有k_BackingField
此外,设置.设置被视为Mobile\u SettingModels
对象,而不是SettingViewModels
。那么设置.设置又有了标记
和设置
我的NewtonsoftJson版本是10.0.3
发生了什么事
更新
因此,实际上问题在于Xamarin Live设备播放器的调试。我在我的小米红米A4中使用实时播放器调试。如果Json对象仅为1层,则可以正常工作。如果存在嵌套对象,则会失败。我使用模拟器进行调试,一切正常。我相信这是一个错误
除非这里有人告诉我如何修复它。对于备份字段问题,您必须更改服务器端代码。为每个属性提供备份字段。您正在服务器端序列化
我想我明白你的问题了
<< Setting >>k__BackingField
<< Token >>k__BackingField
要解决此问题,您可以如下所示为其创建支持值
private Setting _setting;
public Setting {get {return _setting;}set {_setting= value;}
private Token _token;
public Token {get {return _token;}set {_token= value;}
当我开始在我的应用程序中使用WebAPI时,我遇到了同样的问题,当我提供支持字段时,它对我起作用了
在我这边试过你的代码,它似乎起作用了
string json = "{" +
"'Token':'DEJkEKQpAUR3UvUc5ZFoYAO4vt3Cq4ErZOc/KeERRu'," +
"'Setting':" +
"{" +
"'CompanyToken':'xxxxxxxx'," +
"'ApiKey':'AIzaSyAZ6bZ02BAd_zzzzzzzzzzzzzzzz'," +
"'Password':null," +
"'MarkRedAfter':30" +
"}" +
"}";
var setting = JsonConvert.DeserializeObject<Mobile_SettingModels>(json);
string json=“{”+
“‘代币’:‘代币’,”+
“‘设置’:”+
"{" +
“'CompanyToken':'xxxxxxxx'”+
“'ApiKey':'AIzaSyAZ6bZ02BAd_zzzzzzzzzzzzzzzz'”+
“密码”:空,”+
“'MarkRedAfter':30”+
"}" +
"}";
var setting=JsonConvert.DeserializeObject(json);
请检查您是否正在尝试类似的操作,下面是对asp.net webAPI框架创建的webAPI进行的示例代码调用
using (var client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync("url");
response.EnsureSuccessStatusCode();
using (HttpContent content = response.Content)
{
string responseBody = await response.Content.ReadAsStringAsync();
var obj = JsonConvert.DeserializeObject<Mobile_SettingModels>(responseBody);
}
}
使用(var-client=new-HttpClient())
{
HttpResponseMessage response=wait client.GetAsync(“url”);
response.EnsureSuccessStatusCode();
使用(HttpContent=response.content)
{
string responseBody=wait response.Content.ReadAsStringAsync();
var obj=JsonConvert.DeserializeObject(responseBody);
}
}
能否构建测试版本并填充对象,然后将其序列化为JSON?我无法重现您的问题,设置是从您指定的JSON反序列化的。您确定result
与您在问题中粘贴的JSON完全相同吗?您能调试它并向我们展示var result中的确切内容吗?var setting=JsonConvert.DeserializeObject(result)//试试这个,它看起来好像在那个对象中有列表..是的,结果就是我从Encoding.UTF8.GetString(client.UploadValues(uploadUrl,values))得到的结果代码>。这就是我从调试中看到的。我认为一切都很好,因为我得到的响应结果是正确的。问题在于反序列化。我真的很困惑here@AlvinStefanus-对于备份字段问题,您必须更改服务器端代码..为每个属性提供备份字段..您正在服务器端序列化..我已检查服务器,其中没有使用序列化属性。我试着使用上面的测试用例。我知道问题出在哪里了。问题出在JsonConvert.DeserializeObject()中。它的结果产生k_backingfield,也就是设置。设置再次引用自身。我不知道这是怎么发生的。所以Debbug说setting.Token是type string,但是setting.setting是typeMobile\u SettingModel
应该是SettingViewModels
。
using (var client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync("url");
response.EnsureSuccessStatusCode();
using (HttpContent content = response.Content)
{
string responseBody = await response.Content.ReadAsStringAsync();
var obj = JsonConvert.DeserializeObject<Mobile_SettingModels>(responseBody);
}
}