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

时间:2016-08-26 15:54:35

标签: json asp.net-mvc deserialization

我是反序列化JSON数据的新手 我从服务的响应主体那里得到了JSON数据

"{\"Table\":[{\"SessionID\":\"DADF8335-31D3-401A-822F-6FCBF429DFC5\",\"Data\":\"80110144\",\"Expiration\":\"2016-08-25T21:22:51.683\"}]}"

当我尝试反序列化并将其传递给变量时,它显示空数据。

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

null data image

using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("https://sample.com");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                HttpResponseMessage response = await client.GetAsync("SessionAPI/api/SessionMgmt/UseSession?SessionID=" + SessionID);

                if (response.IsSuccessStatusCode)
                {
                    string responseBody = await response.Content.ReadAsStringAsync();
                    SessionStoreID ServiceInfo = JsonConvert.DeserializeObject<SessionStoreID>(responseBody);

                    Response.Write(ServiceInfo.Data);
                }
            }

这是我的专业课程

public class SessionStoreID
    {
        public string Session { get; set; }
        public string Data { get; set; }
        public DateTime ExpiredDate { get; set; }
    }

可以指导一下如何解决这个问题

4 个答案:

答案 0 :(得分:2)

您的SessionStoreID班级不正确,因此无法映射。

您需要执行以下操作:

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(string)]属性,因为您的属性名称与Json键名称不匹配,因此无法自动填充对象中的这些字段。

答案 1 :(得分:0)

我总是只用http://json2csharp.com/来分解我的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; }
    }
}

控制器:

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>;

答案 2 :(得分:0)

您可以使用DataContractJsonSerializer类 您可以从下面的示例中How to serialize deserialize data

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();  

答案 3 :(得分:-1)

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

JsonConvert.DeserializeObject<dynamic>(responseBody);

这为您提供了一个对象,其中包含您可以复制的结构中的数据。您可以将动态对象与要使用的对象进行比较,并确保它们匹配。

一旦你有了正确的结构,摆脱动态演员并使用你正确的响应类。随着响应变得越来越大,此方法变得更有用,复制您可以在调试器中查看和检查的对象要容易得多。