C# 为什么';WCF/JSON返回'null'表示空返回值?

C# 为什么';WCF/JSON返回'null'表示空返回值?,c#,json,wcf,C#,Json,Wcf,根据,表示空值的正确方法是literalnull 如果是这样,为什么WCF返回空响应而不是null?这是一个bug还是在某处记录了这种行为 完整的复制示例: using System; using System.ServiceModel; using System.ServiceModel.Web; [ServiceContract()] public class Service1 { [OperationContract(), WebGet(ResponseFormat = WebM

根据,表示空值的正确方法是literal
null

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

完整的复制示例:

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

$
您的to json规范包括以下有趣的行:

JSON构建在两种结构上:

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

  • 值的有序列表。在大多数语言中,这是以数组、向量、列表或序列的形式实现的

  • 所以,据我所知,你们的退货类型不符合规格

    • 既不是
      公共字符串GetNull(){return null;}

    • nor
      public string GetSomeString(){返回“SomeString”}

    要满足规格要求,您必须将其更改为与#1或#2匹配

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

  • 使用大小为1的数组<代码>公共对象[]GetNullArray(){返回新对象[1];}。默认值再次为空;它返回:

  • 在我看来,JSON是基于封装数据的,比如XML,在XML中总是需要父节点。因此,我想没有其他解决方案可以使用结构/类(#1)或数组(#2)

    更新:

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

    请注意,以前的某些JSON规范将JSON文本约束为对象或数组。只生成调用JSON文本的对象或数组的实现将具有互操作性,因为所有实现都将接受这些对象或数组作为一致的JSON文本

    如果我理解正确,今天应该返回are right and null,因为它是一个原语,但不会返回,因为主要关注的可能是仅基于对象和基于数组的版本的旧指定行为


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

    在我看来,WCF或其他方式都是数据传输契约,所有的数据库都是基于字符串的。不同之处在于如何压缩字符串形式。
    此方法只返回一个字符串,无论格式如何,只有客户端才能获取数据,因此不需要是json格式。
    如果只返回字符串
    “null”
    表示
    null
    如果我想返回字符串
    “null”
    而不是
    null
    ,该怎么办。会弄糊涂的。当然你可以用ESC字符来解决它。也许他们认为没有比这更好的了。

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

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

    [DataContract] 
    public class Employee 
    { 
    [DataMember]
    public string id { get; set; }
    }
    
    现在,在你的运营合同中,像这样返还它

    [OperationContract(), WebGet(ResponseFormat = WebMessageFormat.Json)]
    public string GetNull() { return new Employee(); }
    
    然后,您将在json响应中使用空值


    希望有帮助

    ,因为空值可以用许多不同的方式表示。更多信息,请参阅本文:@TomRedfern:该文章的公认答案还声称,
    null
    是根据JSON规范表示null的方式。我的问题是,为什么WCF会偏离规范。鉴于,我想知道您的服务是否真的响应了
    内容类型:application/json
    ?@GSerg:好问题,我刚刚检查过:它响应的是
    内容类型:application/json;对于GetSomeString,charset=utf-8
    ,对于GetNull,没有内容类型头。正如我在下面的回答中所评论的,我相信JSON主页中的引用仅总结了原始值之外可用的数据结构,而不是将JSON“基本元素”限制为两个元素之一。相关讨论:。我认为,除了公认的答案外,问题和现在列出的原语以及WCF都来自失败的时代,这一点特别重要。这是一个有趣的观点,但我相信您在JSON主页上的引用并不意味着有效的JSON文本必须有一个对象或数组作为基本元素。如果我们查看从页面链接的ECMA-404 PDF,就会发现任何JSON值都是有效的JSON文本。引用(emphasis mine):JSON文本是由符合JSON值语法的Unicode代码点形成的标记序列。[…]JSON值可以是对象、数组、数字、字符串、
    true
    false
    null
    。因此,
    null
    “abc”
    将是有效的JSON文本,但``(空)不会。是的,发送方和接收方知道消息的含义才是重要的。