将F#list设置为null以进行序列化

时间:2014-09-09 17:05:29

标签: f# json.net

我正在使用F#和JSON数据存储,并使用JSON.NET库。我试图在可能的情况下使用F#结构和类型,并遇到以下问题。假设我希望存储以下数据结构,

type A = {
    id : int
    name : string
    posts : string list
}

创建工作正常,但要仅更新存储的name字段,我需要发送省略posts字段的JSON记录。使用空列表将不起作用,因为持久性系统将假定我希望用空列表替换现有帖子,从而覆盖它们。从JSON.NET docs我读过,通过将字段设置为null

可以省略序列化中的字段
let updatedEntry = { id : 0, name : "Fred", posts = null }

然而,F#编译器会给出一个错误,指出list类型不能设置为null。无论如何要在F#中实现这一点,也许是一个我不知道的属性?感谢

1 个答案:

答案 0 :(得分:4)

有两种方法可以轻松完成此任务:

选项1

使用System.Collections.Generic.List类型,该类型可以为null:

> type A = {id: int; name:string; posts: System.Collections.Generic.List<string> };;

type A =
  {id: int;
   name: string;
   posts: System.Collections.Generic.List<string>;}

> let a = {id=5; name="hello"; posts=null};;

val a : A = {id = 5;
             name = "hello";
             posts = null;}

选项2

另一种更惯用的方式是使用选项类型:

> type A = {id: int; name:string; posts: string list option };;

type A =
  {id: int;
   name: string;
   posts: string list option;}

> let a = {id=5; name="there"; posts=None};;

val a : A = {id = 5;
             name = "there";
             posts = null;}

请注意,您要将posts成员与None进行比较,而不是null

方便阅读:Option types


修改

(经过一些搜索和实验)你可以使用拳击仍然使用F#类型作为值:

> type A = {id: int; name:string; posts: System.Object };;

type A =
  {id: int;
   name: string;
   posts: Object;}

> let a = {id=5; name="foo"; posts=null};;

val a : A = {id = 5;
             name = "foo";
             posts = null;}

> let b = {id=6; name="bar"; posts=(box [])};;

val b : A = {id = 6;
             name = "bar";
             posts = [];}

但我坚持使用Option类型,个人