为什么WCF/JSON没有为null返回值返回`null`?

Hei*_*nzi 16 c# wcf json

根据JSON规范,表示空值的正确方法是文字null.

如果是这种情况,为什么WCF会返回空响​​应而不是null?这是一个错误还是在某处记录了这种行为?

完整的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();
    }
}
Run Code Online (Sandbox Code Playgroud)

预期结果:

$ curl http://localhost:8000/GetSomeString && echo
"SomeString"
$ curl http://localhost:8000/GetNull && echo
null
$
Run Code Online (Sandbox Code Playgroud)

实际结果:

$ curl http://localhost:8000/GetSomeString && echo
"SomeString"
$ curl http://localhost:8000/GetNull && echo

$
Run Code Online (Sandbox Code Playgroud)

Flo*_*.i. 6

指向 json规范的链接包括以下有趣的内容:

JSON基于两种结构:

  1. 名称/值对的集合.在各种语言中,这被实现为对象,记录,结构,字典,散列表,键控列表或关联数组.

  2. 有序的值列表.在大多数语言中,这被实现为数组,向量,列表或序列.

因此,根据我的理解,您的返回类型不符合规范.

  • 也不 public string GetNull() { return null; }

  • 也不 public string GetSomeString() { return "SomeString"; }

要满足规范,您必须更改它们以匹配#1或#2.

  1. 使用结构.public struct structWithNull{public object resp;}默认值为null,因此public structWithNull GetNull() {return new structWithNull() ; }返回: struct返回的null值

  2. 使用大小为1的数组.public object[] GetNullArray() {return new object[1] ; }.默认值再次为null; 它返回: 一个元素数组返回的null值

在我看来,JSON基于封装数据,如XML,总是需要父节点.所以我想对于使用struct/class(#1)或数组(#2)没有其他解决方案.

更新:

我在这里找到了一个线索:rfc7159

请注意,某些先前的JSON规范将JSON文本约束为对象或数组.只生成调用JSON文本的对象或数组的实现将是可互操作的,因为所有实现都将接受这些作为符合JSON文本.

如果我理解正确,那么你是正确的,今天应该返回null,因为它是一个原语,但不会因为主要焦点可能是唯一的对象和基于数组的版本的旧指定行为.

最后我相信只有微软可以完全回答这个问题.