我有一个非常简单的DataContract类,我需要反序列化。我没有出于特殊原因使用JSON.NET,因此请使用DataContractJsonSerializer。
我的合同类看起来像这样
[DataContract(Name = "d")]
public class ResponseClass
{
[DataMember]
public int ResponseCode
{ get; set;}
[DataMember]
public string ResponseMessage
{ get; set;}
[DataMember]
public string Response
{ get; set;}
}
服务调用返回时带有有效的Json字符串,但在反序列化时,尽管传递的值为非0或非string.Empty,但最后的值始终为0或string.Empty。
我的deserialise代码看起来像这样
private string deserializeJSON(string resp, bool code = false)
{
string value = string.Empty;
ResponseClass deserialized = null;
using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(resp)))
{
stream.Position = 0;
var ser = new DataContractJsonSerializer(typeof(ResponseClass));
deserialized = ser.ReadObject(stream) as ResponseClass;
}
value = code ? deserialized.Response : deserialized.ResponseCode.ToString();
return value;
}
我已经四处寻找答案,但没有任何东西回来。
数据返回看起来像这样(这就是为什么合同返回称为“d” - 不确定是否有所不同,但结果仍然相同,RespCode为0,RespMess,Resp = string。空)
{
"d":
{
"RespCode": 0,
"RespMess": null,
"Resp": null
}
}
答案 0 :(得分:1)
由于您的C#类属性(例如ResponseCode
)和JSON名称(例如RespCode
)不匹配,您需要在Name
中指定DataMember
个d
属性。具有ResponseClassContainer
的结构可以由另一个类(我为其创建DataContract
)表示,而不是简单地命名d
private string deserializeJSON(string resp, bool code = false)
{
string value = string.Empty;
ResponseClass deserialized = null;
using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(resp)))
{
stream.Position = 0;
var ser = new DataContractJsonSerializer(typeof(ResponseClassContainer));
deserialized = (ser.ReadObject(stream) as ResponseClassContainer).d;
}
value = code ? deserialized.Response : deserialized.ResponseCode.ToString();
return value;
}
[DataContract]
public class ResponseClassContainer
{
[DataMember]
public ResponseClass d { get; set; }
}
[DataContract]
public class ResponseClass
{
[DataMember(Name="RespCode")]
public int ResponseCode
{ get; set;}
[DataMember(Name="RespMess")]
public string ResponseMessage
{ get; set;}
[DataMember(Name="Resp")]
public string Response
{ get; set;}
}
。这有效:
0
存在null
整数和{{1}}字符串,因为它们是各自类型的默认值。由于字符串没有任何公认的数据,所以那些都是那里设置的。