当前位置: 首页 > 知识库问答 >
问题:

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

张嘉熙
2023-03-14

根据JSON规范,表示null值的正确方法是文字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

$

共有1个答案

查宜民
2023-03-14

您到json规范的链接包括这些有趣的行:

JSON构建在两个结构上:

>

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

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

    因此,在我的理解中,您的返回类型不符合规范。

    >

  • neut公共字符串GetNull(){return null;}

    nor公共字符串GetSomeString(){return“SomeString”;}

    要完全填充规范,您必须更改它们以匹配#1或#2。

    在我看来,JSON是以封装数据为基础的,就像XML一样,在XML中总是需要父节点。因此,我想除了使用结构/类(#1)或数组(#2)之外,没有其他解决方案。

    更新:

    我在这里发现了一条线索:rfc7159

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

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

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

  •  类似资料:
    • 问题内容: 这是简单的代码,我没有得到设置位图的结果,而是得到了null。谁能告诉我我在哪里犯错了? 更新 好的,所以我无法像我想的那样将文本转换为图像。这样呢 这会创建位图吗? 问题答案: 从文档中: 返回 解码的位图;如果无法解码图像,则 返回 null。 字符串“ test”中涉及的字节不是有效的位图,对吗? 如果将文本“ test”保存在名为or 等的文件中,并试图在Windows中打开它

    • 问题内容: 我已经存储了在该数据库中插入并插入记录的过程。我想获取最后插入的记录的ID。返回NULL并返回正确的ID,为什么会发生?如我所读,因此最好在表上有一些触发器的情况下使用。我可以使用吗?不论触发器如何,它是否都在表的范围内返回ID? 那么问题是什么以及使用什么呢? 已编辑 问题答案: 就像奥德(Oded)所说的那样,问题在于您在执行之前要先询问身份。 作为解决方案,最好尽可能地接近运行。

    • 我正在尝试访问项目中的文件。但是getResource方法返回null。 以及eclipse工作区中项目文件夹的外观: 为什么啊?我想访问我的资产文件夹中的文件? 编辑我创建了一个jar文件,这是jar的内容: 已解决 首先,我有很多图像文件,所以我想把它们组织在一个文件夹中。我把assets文件夹放在src目录中,最后我能够访问这些文件。

    • 我的jar中有一个图像,我正试图加载它,但是getResourceAsStream()总是返回null。 目录结构: 所容纳之物爪哇: 一般内容。爪哇: StackTrace: 我不知道为什么类加载器找不到图像。我已经在编译的jar中查看过了,文件在那里,并且在油漆中打开很好,所以文件是OK的。我已经尝试了各种ClassLoader变体,包括getSystemClassLoader(),getCl

    • 我正在做一个练习游戏。 我有一个Spring引导/Maven项目连接到MySQL数据库。我能够设置一个api,它只是从我的“所有谜语”表中检索所有内容。它以前工作过,但是现在api返回一个json,其中一些键的值为空。我唯一玩的是Spring引导文件上的application.properties。我在spring.jpa.hibernate.ddl的“更新”和“无”之间跳跃。我到底做错了什么?

    • 问题内容: 为什么第一个返回,而第二个返回? 这不是很奇怪吗?如果不是,此行为背后的逻辑是什么? 下划线是罪魁祸首吗?为什么? 问题答案: 如@hsz的评论中所述,这是已知的bug。 但是,让我们调试并查看类的源代码。问题出在方法内部: : 第一个URI解析失败 这是因为符号未扫描块内foreseed,它只允许阿尔法,数字和符号(,,和)。 是的,这尚未在中解决。