【问题标题】:WCF Service Returns Invalid JSON outputWCF 服务返回无效的 JSON 输出
【发布时间】:2014-06-14 05:16:50
【问题描述】:

我创建了一个 WCF 类库,其中包含一个名为 SampleJSON(string name) 的函数。

运营合同是这样的:

[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "sample/{name}")]
string SampleJSON(string name);

我打算从函数 SampleJSON() 返回有效的 JSON 输出,返回部分是这样的:

StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);


sw.Write("{");
sw.Write("\"" + "firstname" + "\"" + ":");
sw.Write("\"" + "samplefirstname" + "\"" + ",");
sw.Write("\"" + "lastname" + "\"" + ":");
sw.Write("\"" + "samplelastname" + "\"" + "}");

sw.Flush();
sw.Close();

return sb.ToString();

我的服务创建的输出是这样的:

"{\"firtsname\":\"samplefirstname\",\"lastname\":\"samplelastname\"}"

这显然是无效的。

我也尝试过使用 Newton.JSON 。但我仍然有问题。

我想我需要返回一个 JSONObject 而不是字符串,但我不知道该怎么做,而且 Newton.JSON 的文档对我没有帮助。

如何生成最终创建有效 JSON 输出的 JSONObject,最好使用 Newton.JSON。


[编辑] 这是我正在使用的新代码和浏览器上的结果:

        StringBuilder sb = new StringBuilder();

        StringWriter sw = new StringWriter(sb);

        JsonTextWriter writer = new JsonTextWriter(sw);

        writer.WriteStartObject();

        writer.WritePropertyName("insertresult");
        writer.WriteValue(resultArray[0]);

        writer.WritePropertyName("insertmessage");
        writer.WriteValue(resultArray[1]);

        writer.WritePropertyName("sendsmsresult");
        writer.WriteValue(resultArray[2]);

        writer.WritePropertyName("sendsmsmessage");
        writer.WriteValue(resultArray[3]);

        writer.WriteEndObject();

        writer.Flush();

        sw.Flush();

        return sb.ToString();

浏览器上的结果:

"{\"insertresult\":\"false\",\"insertmessage\":\"already existed\",\"sendsmsresult\":\"false\",\"sendsmsmessage\":\"noId\"}"

如您所见,此 json 无效。

这个 json 将被一个 android 应用程序使用。 我的问题是: android 应用看到我在此处看到的内容,还是看到有效格式?

【问题讨论】:

    标签: c# json wcf json.net


    【解决方案1】:

    如果您想在 WCF 中返回复杂类型并将它们正确序列化为 JSON,您需要创建一个 data contract。数据协定只是一个包含要序列化的数据的类,其中该类标有[DataContract] 属性,并且您要序列化的该类的每个成员都标有[DataMember] 属性。例如:

    [DataContract]
    public class Person
    {
        [DataMember(Name="firstname")]
        public string FirstName { get; set; }
    
        [DataMember(Name="lastname")]
        public string LastName { get; set; }
    }
    

    使用数据协定,更改您的服务方法以构建并返回该类的实例而不是字符串。例如:

    Person SampleJSON(string name)
    {
        Person p = new Person
        {
            FirstName = "samplefirstname",
            LastName = "samplelastname"
        }
        return p;
    }
    

    WCF 会自动将数据序列化为 JSON。如果您尝试先手动对其进行序列化,那么您将得到包含反斜杠的双序列化字符串,如您所见。

    如果您出于某种原因需要手动处理序列化,那么您将不得不替换或解决 WCF 的序列化程序。请参阅this answer 了解起点。

    【讨论】:

    • 很好的答案布赖恩!我正在阅读您刚刚提供的链接。我会尽快回来。 :)。问题肯定是双重序列化。你是对的。
    • 我检查了链接和整个双序列化问题,最终让 wcf 负责序列化。虽然 newtonsoft.json 是一个很棒的工具,但我真的不想参与整个反序列化的痛苦过程。无论如何感谢您的参与。你的回答和链接真的很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    相关资源
    最近更新 更多