WCF服务返回无效的JSON输出

时间:2014-04-28 15:17:05

标签: c# json wcf json.net

我创建了一个WCF类库,其中包含一个名为SampleJSON(字符串名称)的函数。

Opertation Contract就是这样的:

[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的Docs也没有帮助我。

如何生成最终创建有效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应用程序是否看到我在此处看到的内容,或者它是否看到了有效的格式?

1 个答案:

答案 0 :(得分:4)

如果要在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作为起点。