我是反序列化JSON数据的新手 我从服务的响应主体那里得到了JSON数据
"{\"Table\":[{\"SessionID\":\"DADF8335-31D3-401A-822F-6FCBF429DFC5\",\"Data\":\"80110144\",\"Expiration\":\"2016-08-25T21:22:51.683\"}]}"
当我尝试反序列化并将其传递给变量时,它显示空数据。
这是我在控制器中的代码,这是变量' ServiceInfo '获取空数据
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; }
}
可以指导一下如何解决这个问题
答案 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);
这为您提供了一个对象,其中包含您可以复制的结构中的数据。您可以将动态对象与要使用的对象进行比较,并确保它们匹配。
一旦你有了正确的结构,摆脱动态演员并使用你正确的响应类。随着响应变得越来越大,此方法变得更有用,复制您可以在调试器中查看和检查的对象要容易得多。