从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",并放弃了它。

从JSON解析的数组字段为空

下面解释如何使List工作。我通常使用数组(例如:string[]而不是Array类)来避免在客户端出现问题或额外的配置和强制转换。