Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Newtonsoft Json反序列化错误_C#_Json - Fatal编程技术网

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是type
    Mobile\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);  
    
      }
    }