首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么WCF/JSON不为null返回值返回`null`?

为什么WCF/JSON不为null返回值返回`null`?
EN

Stack Overflow用户
提问于 2016-08-21 23:08:40
回答 2查看 1.1K关注 0票数 16

根据JSON spec的说法,表示空值的正确方法是文字null

如果是这样,为什么WCF返回一个空响应而不是null?这是一个bug,还是这种行为被记录在某个地方?

完整的repro示例:

代码语言:javascript
复制
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();
    }
}

预期结果:

代码语言:javascript
复制
$ curl http://localhost:8000/GetSomeString && echo
"SomeString"
$ curl http://localhost:8000/GetNull && echo
null
$

实际结果:

代码语言:javascript
复制
$ curl http://localhost:8000/GetSomeString && echo
"SomeString"
$ curl http://localhost:8000/GetNull && echo

$
EN

回答 2

Stack Overflow用户

发布于 2016-10-09 18:22:33

在我看来,WCF或其他方式都是数据传输合同,所有的数据都是基于字符串的。不同之处在于如何收缩字符串形式。

此方法只返回一个字符串,无论格式如何,只有客户端才能获取数据,因此它不需要是json格式。

如果只返回字符串"null"表示null,如果我想返回字符串"null"而不是null怎么办?它会被弄糊涂。当然你可以使用ESC字符来解决它。也许他们认为没有比这更好的了。

如果客户端使用json格式数据,您只需返回一个字符串"null",然后客户端将其反序列化得到一个null,一切正常。无论如何,返回什么并不重要,重要的是如何压缩数据格式。

票数 0
EN

Stack Overflow用户

发布于 2016-10-10 18:10:46

如果您希望在wcf响应中以json格式返回实际的null值,则应该定义一个数据契约并在不初始化它的情况下返回它

代码语言:javascript
复制
[DataContract] 
public class Employee 
{ 
[DataMember]
public string id { get; set; }
}

现在,在您的操作合同中,像这样返回它

代码语言:javascript
复制
[OperationContract(), WebGet(ResponseFormat = WebMessageFormat.Json)]
public string GetNull() { return new Employee(); }

然后,您将在json响应中为空值。

希望能有所帮助

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39065676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档