为什么WCF/JSON不返回空返回值?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)

根据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();
    }
}

预期结果:

$ 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

$
提问于
用户回答回答于

在我看来,WCF或其他方式是数据传输合同,以及所有数据库上的字符串。区别只是如何缩小字符串表单。 这个方法只是返回一个字符串,不管客户端如何获取数据格式如何,所以它不需要是json格式。 如果只是返回字符串"null"表示null如果我想返回字符串"null"而不是null。它会感到困惑。当然你可以使用ESC字符来解决它。也许他们认为没有更好的。 如果客户端使用json格式的数据,你只要返回一个字符串"null",然后客户端反序列化它得到一个null,一切都很好。无论如何,返回是无关紧要的,但如何签约数据格式。

用户回答回答于

json规范链接包含以下有趣的内容:

JSON建立在两个结构上:

  1. 名称/值对的集合。在各种语言中,这被实现为对象,记录,结构,字典,散列表,键控列表或关联数组。
  2. 有序的值列表。在大多数语言中,这是作为数组,矢量,列表或序列实现的。

所以,根据我的理解,退货类型不符合规格。

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

要填写规格,必须将其更改为匹配#1或#2。

  1. 使用一个结构体。public struct structWithNull{public object resp;}默认值为空,所以public structWithNull GetNull() {return new structWithNull() ; }返回:
  1. 使用大小为1的数组。public object[] GetNullArray() {return new object[1] ; }。默认值再次为空; 它返回:

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

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

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

如果我正确地理解了这一点,那么你的答案是正确的,并且null应该返回,因为它是一个原语,但不会因为主要焦点可能是基于对象和基于数组的版本的旧指定行为。

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

扫码关注云+社区