应要求A
,我得到回应:
{
"session":{
"lifetime":"600",
"sid":"qweasdzxc:"
},
"httpStatus":200,
"response":{
"state":"password",
"token":"foobar123",
"next_state":"dispatch"
}
}
并应要求B
我收到另一个答复:
{
"session":{
"lifetime":"600",
"sid":"qweasdzxc:"
},
"httpStatus":200,
"response":{
"origin":"NORMAL",
"activate_bpa":false,
"state":"dispatch",
"next_state":"STOP"
"is_nordea":false,
"login_type":"NORMAL"
},
"data":{
"img_src":"example.com"
}
}
响应之间几乎没有区别。我应该如何处理?
我的第一个想法是创建将容纳所有可能数据的类:
public class BaseResponse
{
public Session session { get; set; }
public int httpStatus { get; set; }
public Response Response { get; set; }
}
public class Session
{
public string lifetime { get; set; }
public string state { get; set; }
}
public class Response
{
public string state { get; set; }
public string token { get; set; }
public string next_state { get; set; }
public bool activate_bpa {get; set;}
public string origin {get; set;}
public bool is_nordea { get; set;}
public string login_type {get; set;}
public Data Data {get; set;}
}
public class Data
{
public string img_stc {get; set;}
}
现在,我可以从请求A
和B
获取数据,并将其中两个解析为BaseResponse
,如下所示:
var aParsed = JsonConverter.DeserializeObject<BaseResponse>(aContent);
var bParsed = JsonConverter.DeserializeObject<BaseResponse>(bContent);
问题在于,aParsed
将包含origin
,activate_bpa
(以及更多)属性,这些属性将永远不会设置。我希望对象具有可响应的属性。
我真的不能在同一名称空间中创建两个不同的Response
类。那我该怎么办?
答案 0 :(得分:0)
如果您使用一些自动反序列化机制,请使用泛型。
public class BaseResponse<T>
{
public Session session { get; set; }
public int httpStatus { get; set; }
public Response Response { get; set; }
public T Data {get; set;}
}
...
public class Data
{
public string img_stc {get; set;}
}
然后使用指定的 data 类
反序列化var response = JsonConverter.Deserialize<BaseResponse<Data>>(json);
您可以对 Response 类
执行相同的操作public class BaseResponse<TD, TR>
{
public Session session { get; set; }
public int httpStatus { get; set; }
public TR Response { get; set; }
public TD Data {get; set;}
}
var response = JsonConverter.Deserialize<BaseResponse<Data, ResponseA>>(json);
答案 1 :(得分:0)
您可以通过以下方式将它们反序列化为动态对象
JObject obj = JObject.Parse(json);
https://www.newtonsoft.com/json/help/html/ParsingLINQtoJSON.htm
然后,您可以通过点(。)表示法在对象中引用属性,例如, obj.origin,obj.state ... ect。
但是您将在这里丢失编译时类型检查,并且没有响应的基本数据结构。
答案 2 :(得分:0)
使用动态作为数据类型进行响应
public class BaseResponse
{
public Session session { get; set; }
public int httpStatus { get; set; }
public dynamic Response { get; set; }
}