从JSON解析的数组字段为空

时间:2015-05-25 13:13:13

标签: c# json wcf

我不明白为什么会这样。我通过WCF使用REST服务。如果出现错误,服务会发送这种消息体(我在Fiddler中看到):

{"Errors":["Some text"],"StatusCode":500}

我为此创建了一个类,并通过Message.GetBody()获取它。 StatusCode已填充,但错误始终为空(不为空,但为空)。我试过String [],List of String,也尝试过初始化后备字段。这有什么不对?

这是班级:

[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="")],因为我收到了错误&#34;期待元素ErrorResult与命名空间&#39; bla-bla-bla&#39;但得到了元素&#39; root&#39;使用命名空间&#39;&#39;&#34;。

更新即可。我注意到另一个实体的相同问题,即服务结果类型。它包含2个整数字段,并且返回时它们是0,即使我可以在Fiddler和Message.ToString()值中看到它。我通过添加Name =&#34; ...&#34;来解决这个问题。到DataMember属性,即使这些名称与属性名称相同,除了大写(JSON camel vs C#pascal)。我确信C#解析不区分大小写!好的,但是在主题中为ErrorResult添加名称仍然没有解决数组的问题。

更新2 。好的,在没有找到任何解决方案后,我以一种丑陋的方式做了一个解决方法&#34;。至少这一刻就开始了。

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));

我也尝试过使用Message.GetReaderAtBodyContents()的XMlSerialzer,但在XML&#34;中得到错误#34;放弃了。

1 个答案:

答案 0 :(得分:0)

Here解释了如何使List工作。我通常使用数组(例如:string []而不是Array类)来避免问题或其他配置并在客户端进行强制转换。