根据JSON spec的说法,表示空值的正确方法是文字null
。
如果是这样,为什么WCF返回一个空响应而不是null
?这是一个bug,还是这种行为被记录在某个地方?
完整的repro示例:
using System;
using System.ServiceModel;
using System.ServiceModel.Web;
[ServiceContract()]
public class Service1
{
[OperationContract(), WebGet(ResponseFormat = WebMessageFormat.Json)]
public string GetSomeString() { return "SomeString"; }
[OperationContract(), WebGet(ResponseFormat = WebMessageFormat.Json)]
public string GetNull() { return null; }
}
public class Host
{
public static void Main()
{
// Very simple WCF server
var host = new WebServiceHost(typeof(Service1), new Uri("http://localhost:8000/"));
host.AddServiceEndpoint(typeof(Service1), new WebHttpBinding() {
HostNameComparisonMode = HostNameComparisonMode.Exact
}, "");
host.Open();
Console.WriteLine("Service is running, press enter to quit...");
Console.ReadLine();
host.Close();
}
}
预期结果:
$ curl http://localhost:8000/GetSomeString && echo
"SomeString"
$ curl http://localhost:8000/GetNull && echo
null
$
实际结果:
$ curl http://localhost:8000/GetSomeString && echo
"SomeString"
$ curl http://localhost:8000/GetNull && echo
$
发布于 2016-10-09 18:22:33
在我看来,WCF或其他方式都是数据传输合同,所有的数据都是基于字符串的。不同之处在于如何收缩字符串形式。
此方法只返回一个字符串,无论格式如何,只有客户端才能获取数据,因此它不需要是json格式。
如果只返回字符串"null"
表示null
,如果我想返回字符串"null"
而不是null
怎么办?它会被弄糊涂。当然你可以使用ESC字符来解决它。也许他们认为没有比这更好的了。
如果客户端使用json格式数据,您只需返回一个字符串"null"
,然后客户端将其反序列化得到一个null
,一切正常。无论如何,返回什么并不重要,重要的是如何压缩数据格式。
发布于 2016-10-10 18:10:46
如果您希望在wcf响应中以json格式返回实际的null值,则应该定义一个数据契约并在不初始化它的情况下返回它
[DataContract]
public class Employee
{
[DataMember]
public string id { get; set; }
}
现在,在您的操作合同中,像这样返回它
[OperationContract(), WebGet(ResponseFormat = WebMessageFormat.Json)]
public string GetNull() { return new Employee(); }
然后,您将在json响应中为空值。
希望能有所帮助
https://stackoverflow.com/questions/39065676
复制相似问题