我创建了一个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应用程序是否看到我在此处看到的内容,或者它是否看到了有效的格式?
答案 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作为起点。