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

F#、Json. NET 6.0和WebApi-记录类型的序列化

申颖逸
2023-03-14

NET 6.0.1增加了对记录和区分联合的F#支持。使用Json序列化F#记录类型时。NET我现在得到格式良好的JSON。

序列化操作如下所示:

let converters = [| (new StringEnumConverter() :> JsonConverter) |]
JsonConvert.SerializeObject(questionSet, Formatting.Indented, converters)

然而,当我试图通过ASP。NET WebApi 5.0服务,用C#编写,序列化的JSON在所有属性前面都包含@符号。@-符号来自记录类型的内部支持字段(这曾经是Json.Net和F#的一个已知问题)。

但是——因为我使用的是更新版的Json。NET,其结果不应该与调用JsonConvert时相同吗?或者jsonvert的行为是否与JsonTextWriterJsonTextReader不同?

从WebApi源代码中的JsonTextWriterJsonTextReader中的JsonMediaTypeFormatter可以看出。

共有2个答案

鲁博瀚
2023-03-14

我认为这是因为F#记录发出的支持字段与C#属性支持字段不遵循相同的命名约定。

我发现解决这个问题的最简单方法是在web应用程序启动时从系统更改ContractResolver。网Http。格式化。JsonContractResolver使用Newtonsoft。Json。序列化。DefaultContractResolver:-

Formatters.JsonFormatter.SerializerSettings.ContractResolver <- DefaultContractResolver()

然后,您将通过Newtonsoft的JSON格式化程序而不是NET格式化程序完成所有JSON格式化。

酆耀
2023-03-14

您可以使用[

[<CLIMutable>]
type MyDtr = {
    Message : string
    Time : string }

这就是我所做的。

要获得良好的XML格式,可以使用:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer <- true

要获得良好的JSON格式,可以使用:

config.Formatters.JsonFormatter.SerializerSettings.ContractResolver <-
    Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()

 类似资料:
  • 问题内容: DataContractJsonSerializer为F#记录类型创建JSON,该JSON类型在每个属性名称后均包含“ @”字符。有谁知道是否有可能获得不带符号结尾的JSON? 这是我用来输出此示例的脚本 问题答案: 尽管Daniel的解决方案可以正常工作,但是必须向记录中的每个属性添加属性是一件很乏味的事情。事实证明,Json.NET开箱即用地生成了更具可读性的JSON。对于我的应用

  • 我有一个C#Asp。Net MVC(5.2.7)应用程序,支持WebApi 2。x目标。净额4.5。1.我正在试验F#,并在解决方案中添加了一个F#库项目。该web应用程序引用了F#库。 现在,我希望能够让C#WebApi控制器返回F#对象,并保存F#对象。我有麻烦序列化F#记录与选项字段。下面是代码: C#WebApi控制器: FsLib.fs: 以下是选项转换器: 我想将选项字段序列化为值(如

  • 问题内容: 我正在编写要与Azure Worker角色一起使用的F#。我希望类将连接字符串a作为参数。我创建一个数据库连接 但是dbSchema是一种类型,因此无法将其嵌入到我的类中(另一种类型)。我可以创建两个单独的模块,一个与数据库连接,另一个与我的课程 但是,如何在类的构造函数中使用connectionString创建连接? 问题答案: SQL数据库的类型提供程序将连接字符串用于两个不同的目

  • 序列,如列表也表示有序的值集合。 但是,在需要时计算序列或序列表达式中的元素。 它们不是一次计算的,因此它们用于表示无限的数据结构。 定义序列 序列使用以下语法定义 - seq { expr } 例如, let seq1 = seq { 1 .. 10 } 创建序列和序列表达式 与列表类似,您可以使用范围和理解来创建序列。 序列表达式是您可以编写用于创建序列的表达式。 这些可以做到 - By

  • 2、记录变量的定义 在程序中,必须先说明记录类型,然后才能定义该记录类型的变量。记录变量是把其二进制位分成一个或多个字段的字节或字变量。其定义格式与其它类型变量的定义方式类似,具体如下: [变量名] 记录名 <[字段值表]> 解释: 1、变量名即为该记录类型的变量名,它可省缺。如果省缺,则不能用符号名来访问该内存单元; 2、字段值表是给字段赋初值,中间用逗号','分开,其字段值的排列顺序及大小应与

  • 4.4.4 记录类型的定义 1、记录类型的说明 汇编语言的记录类型与高级语言的记录类型不同,它是为按二进制位存取数据提供方便的。记录类型的说明要用到另一个保留字RECORD,其说明格式如下: 记录名 RECORD 字段 [, 字段, ……] 其中“字段”代表:字段名:宽度[=初值表达式] 解释: 1、记录名代表该记录类型; 2、记录类型可以由多个字段组成,每个字段之间要用逗号','分开; 3、字段