从JSON解析的数组字段为空
本文关键字:字段 数组 JSON | 更新日期: 2023-09-27 17:50:44
我不明白为什么会这样。我通过WCF消费REST服务。如果出现错误,服务将发送这种消息体(我在Fiddler中看到):
{"Errors":["Some text"],"StatusCode":500}
我为此创建了一个类,并通过Message.GetBody()获得它。StatusCode被填充,但是Errors总是空的(不是null,而是空的)。我已经尝试过字符串[],字符串列表,也尝试过初始化支持字段。这里出了什么问题?
下面是类:
[DataContract(Name="root", Namespace="")]
public class ErrorResult
{
[DataMember]
public string[] Errors { get; set; }
[DataMember]
public int StatusCode { get; set; }
public override String ToString()
{
return String.Join(Environment.NewLine, Errors);
}
}
解析如下:
public void AfterReceiveReply(ref Message reply, object correlationState)
{
var resp = reply.Properties[HttpResponseMessageProperty.Name] as HttpResponseMessageProperty;
if (resp != null && resp.StatusCode != HttpStatusCode.OK)
{
String message = null;
try
{
ErrorResult res = reply.GetBody<ErrorResult>();
if (res != null)
{
message = res.ToString();
}
}
catch { }
if (!String.IsNullOrEmpty(message))
{
throw new Exception(message);
}
}
}
我使用[DataContract(Name="root", Namespace="")]
,因为我得到错误"期望元素ErrorResult与命名空间'bla-bla-bla',但得到元素'root'与命名空间" "。
。我注意到另一个实体也有同样的问题,这个实体是服务结果类型。它包含2个整数字段,并且在返回时它们是0,即使我可以在Fiddler和Message.ToString()中看到值。我通过向DataMember属性添加Name="…"来解决这个问题,即使这些名称与属性名称相同,除了大小写(JSON camel vs c# pascal)。我确信c#解析是不区分大小写的!好的,但是在subject的ErrorResult中添加名字仍然不能解决数组的问题。
更新2 。好吧,在没有找到任何解决方案之后,我用一种"丑陋的方式"做了一个变通。至少这马上开始工作了
XmlDocument doc = new XmlDocument();
doc.LoadXml(reply.ToString());
String message = String.Join(Environment.NewLine,
doc.SelectNodes("/root/Errors/item").OfType<XmlNode>().Select(n => n.InnerText));
我也尝试过XMlSerialzer与Message.GetReaderAtBodyContents(),但得到"错误在XML",并放弃了它。
下面解释如何使List工作。我通常使用数组(例如:string[]而不是Array类)来避免在客户端出现问题或额外的配置和强制转换。