Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/16.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
如何在MVC中反序列化JSON数据_Json_Asp.net Mvc_Deserialization - Fatal编程技术网

如何在MVC中反序列化JSON数据

如何在MVC中反序列化JSON数据,json,asp.net-mvc,deserialization,Json,Asp.net Mvc,Deserialization,我是反序列化JSON数据的新手 我正在从一个服务的responsebody中获取以下JSON数据 "{\"Table\":[{\"SessionID\":\"DADF8335-31D3-401A-822F-6FCBF429DFC5\",\"Data\":\"80110144\",\"Expiration\":\"2016-08-25T21:22:51.683\"}]}" 当我尝试反序列化并将其传递给变量时,它显示的是空数据 这是我在控制器中的代码,这是获取空数据的变量“ServiceInfo”

我是反序列化JSON数据的新手 我正在从一个服务的responsebody中获取以下JSON数据

"{\"Table\":[{\"SessionID\":\"DADF8335-31D3-401A-822F-6FCBF429DFC5\",\"Data\":\"80110144\",\"Expiration\":\"2016-08-25T21:22:51.683\"}]}"
当我尝试反序列化并将其传递给变量时,它显示的是空数据

这是我在控制器中的代码,这是获取空数据的变量“ServiceInfo


您的
会话存储ID
类不正确,因此无法映射,请提供有关如何解决此问题的指南

您需要执行以下操作:

public class SessionStore
{
    [JsonProperty("Table")]
    public List<SessionStoreID> SessionStoreId { get; set;}
}

public class SessionStoreID
{
    [JsonProperty("SessionId")]
    public string Session { get; set; }
    public string Data { get; set; }
    [JsonProperty("Expiration")]
    public DateTime ExpiredDate { get; set; }
}


SessionStore ServiceInfo = JsonConvert.DeserializeObject<SessionStore>(responseBody);
公共类会话存储
{
[JsonProperty(“表格”)]
公共列表会话存储ID{get;set;}
}
公共类会话存储ID
{
[JsonProperty(“SessionId”)]
公共字符串会话{get;set;}
公共字符串数据{get;set;}
[JsonProperty(“到期”)]
公共日期时间过期日期{get;set;}
}
SessionStore ServiceInfo=JsonConvert.DeserializeObject(ResponseBy);

您需要使用属性,因为属性名与Json键名不匹配,因此它无法自动填充对象中的这些字段。

您需要匹配响应的结构。 您可以通过首先投射到动态对象来简化您的生活

JsonConvert.DeserializeObject<dynamic>(responseBody);
JsonConvert.DeserializeObject(responseBody);
这将为您提供一个对象,其中包含可以复制的结构中的数据。可以将动态对象与要使用的对象进行比较,并确保它们匹配

一旦您获得了正确的结构,就可以摆脱动态强制转换并使用适当的响应类。随着响应越来越大,这种方法变得越来越有用,复制一个可以在调试器中看到和检查的对象就容易多了。

我总是用它来分解JSON,而不必思考,我可以用它来构建我的模型,在反序列化JSON之后,它需要如何匹配

型号:

public class JSONModel
{
    public class Table
    {
        public string SessionID { get; set; }
        public string Data { get; set; }
        public DateTime Expiration { get; set; }
    }

    public class RootObject
    {
        public List<Table> Table { get; set; }
    }
}
public类JSONModel
{
公共类表
{
公共字符串SessionID{get;set;}
公共字符串数据{get;set;}
公共日期时间过期{get;set;}
}
公共类根对象
{
公共列表表{get;set;}
}
}
控制器:

using System.Runtime.Serialization.Json;

    MemoryStream data = new MemoryStream(Encoding.UTF8.GetBytes(JSONstring));
    DataContractJsonSerializer serial = new DataContractJsonSerializer(typeof(List<JSONModel>));
    newjson = serial .ReadObject(data) as List<JSONModel>;
使用System.Runtime.Serialization.Json;
MemoryStream data=新的MemoryStream(Encoding.UTF8.GetBytes(JSONstring));
DataContractJsonSerializer serial=新的DataContractJsonSerializer(类型(列表));
newjson=serial.ReadObject(数据)作为列表;

您可以使用DataContractJsonSerializer类 你可以从下面找到一个例子


如果有可用的类型,我会避免将对象反序列化为动态类型。关键是要查看响应的结构,然后将其与实际类匹配。为什么要这样做?这似乎很不必要,因为如果你不能从第一眼就看出结构应该是什么,那么动态的就可以了,为你创建一个对象。一旦你真的看到它,将它与一个具体的类型相匹配就容易多了。当您使用API时,尤其是当响应开始变大时,这不是一件不寻常的事情。伙计,您一直完全没有抓住要点。你调试东西,我不是说永远使用它,我所说的是,首先像这样进行强制转换,使你的类与动态对象匹配,然后去掉动态对象,这样你就可以在不浪费时间的情况下成功地进行强制转换。
public class JSONModel
{
    public class Table
    {
        public string SessionID { get; set; }
        public string Data { get; set; }
        public DateTime Expiration { get; set; }
    }

    public class RootObject
    {
        public List<Table> Table { get; set; }
    }
}
using System.Runtime.Serialization.Json;

    MemoryStream data = new MemoryStream(Encoding.UTF8.GetBytes(JSONstring));
    DataContractJsonSerializer serial = new DataContractJsonSerializer(typeof(List<JSONModel>));
    newjson = serial .ReadObject(data) as List<JSONModel>;
SessionStoreID serviceInfo = new SessionStoreID();
 MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(responseBody ));  
    DataContractJsonSerializer ser = new DataContractJsonSerializer(serviceInfo.GetType());  
    serviceInfo = ser.ReadObject(ms) as SessionStoreID ;  
    ms.Close();