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

时间:2016-08-21 15:08:40

标签: c# json wcf

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

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

完整的复制示例:

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

$

3 个答案:

答案 0 :(得分:6)

您的link到json规范包含以下有趣的内容:

  

JSON基于两种结构:

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

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

  4.   

因此,根据我的理解,您的退货类型并不符合规范。

  • 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() ; }返回: null value returned by struct

  2. 使用大小为1的数组。 public object[] GetNullArray() {return new object[1] ; }。默认值再次为null;它返回: null value returned by one element array

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

    <强>更新

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

      

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

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

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

答案 1 :(得分:0)

在我看来,WCF或其他方式是数据传输合同,并且所有数据都基于字符串。区别于你如何收缩字符串形式 这个方法只返回一个字符串,无论格式如何只有客户端才能获取数据,所以它不需要是json格式。
如果只返回字符串"null"代表null,如果我想返回字符串"null"而不是null,该怎么办?它会被混淆。当然你可以用ESC字符来解决它。也许他们认为没有比这更好的了 如果客户端使用json格式数据,则只返回一个字符串"null",然后客户端反序列化它得到一个null,一切正常。无论如何,返回什么并不重要,但如何签订数据格式。

答案 2 :(得分:-1)

如果你想在json格式的wcf响应中返回实际的空值,你应该定义一个datacontract并在不初始化的情况下返回它

[DataContract] 
public class Employee 
{ 
[DataMember]
public string id { get; set; }
}

现在你的操作合同就像这样返回

[OperationContract(), WebGet(ResponseFormat = WebMessageFormat.Json)]
public string GetNull() { return new Employee(); }

然后你将在json响应中为null值。

希望有所帮助