更新 2010年 10 月 19 日我知道我不久前问过这个问题,但这些答案中显示的解决方法很难令人满意,这仍然是许多人的常见问题。WCF 只是不灵活。我创建了自己的开源 C# 库,用于在没有 WCF 的情况下创建 REST 服务。检查restcake.net或rest.codeplex.com以获取有关该库的信息。 结束更新
更新 8/2/2012 ASP.NET Web API(以前的 WCF Web API,REST WCF 的替代品)默认 使用Json.NET结束更新
DataContractJsonSerializer
无法处理Json.Net在正确配置时处理得很好的许多场景(特别是循环)。
服务方法可以返回特定的对象类型(在本例中为DTO),在这种情况下DataContractJsonSerializer
将使用,或者我可以让该方法返回一个字符串,并自己使用 Json.Net 进行序列化。问题是,当我返回一个 json 字符串而不是一个对象时,发送给客户端的 json 用引号括起来。
使用DataContractJsonSerializer
,返回一个特定的对象类型,响应是:
{"Message":"Hello World"}
使用Json.Net返回一个json字符串,响应为:
"{\"Message\":\"Hello World\"}"
我不想在客户端上对结果进行 eval() 或 JSON.parse() 处理,如果 json 作为字符串返回并用引号括起来,我必须这样做。我意识到行为是正确的;这不是我想要/需要的。我需要原始的json;当服务方法的返回类型是对象而不是字符串时的行为。
那么,我怎样才能让我的方法返回一个对象类型,但不使用 DataContractJsonSerializer?我怎样才能告诉它使用 Json.Net 序列化程序呢?
或者,有没有办法直接写入响应流?所以我可以自己返回原始 json 吗?没有包装引号?
这是我做的例子,供参考:
[DataContract]
public class SimpleMessage
{
[DataMember]
public string Message { get; set; }
}
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class PersonService
{
// uses DataContractJsonSerializer
// returns {"Message":"Hello World"}
[WebGet(UriTemplate = "helloObject")]
public SimpleMessage SayHelloObject()
{
return new SimpleMessage("Hello World");
}
// uses Json.Net serialization, to return a json string
// returns "{\"Message\":\"Hello World\"}"
[WebGet(UriTemplate = "helloString")]
public string SayHelloString()
{
SimpleMessage message = new SimpleMessage() { Message = "Hello World" };
string json = JsonConvert.Serialize(message);
return json;
}
// I need a mix of the two. Return an object type, but use the Json.Net serializer.
}