升级到 .Net 6 后,Json 反序列化无法在使用 Newtonsoft.Json 的 F# 中工作

Joh*_*hur 5 f# json json.net .net-core .net-6.0

这些是我的类型:

[<DataContract>]
type AreaCodeSingleResponse = 
    { [<field:DataMember(Name = "id")>]
      Id : string
      [<field:DataMember(Name = "code")>]
      Code : string
      [<field:DataMember(Name = "name")>]
      Name : string }

[<DataContract>]
type AreaCodeListResponse = 
    { 
    [<field:DataMember(Name = "areacode_list")>]
      AreaCodeList : List<AreaCodeSingleResponse> }
Run Code Online (Sandbox Code Playgroud)

这是数据示例:

{
    "areacode_list": [
        {
            "id": "00447",
            "code": "07",
            "name": "UK Mobile",
            "order_column": "_00447"
        },
        {
            "id": "0044113",
            "code": "0113",
            "name": "Leeds",
            "order_column": "0044113"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

这是反序列化代码,这里调用的是传入类型AreaCodeListResponse:

member __.ReturnDataToType<'T>() =
    __.ReturnData
    |> JsonConvert.DeserializeObject<'T>
Run Code Online (Sandbox Code Playgroud)

在我升级到 DotNet6 之前,这工作正常并返回数据列表。之后,它失败并返回一个空列表。没有抛出任何错误,但列表为空。

对于我使用类和其他类型进行反序列化的所有其他调用来说,这都是失败的。

有什么变化需要我注意吗?我不是 F# 专家,只是在处理一些遗留代码时才开始使用它。

jpe*_*jpe 2

.Net 运行时处理.Net 7 中的(与 F# 中一样)(与 F# 记录结合OptionalFieldAttribute使用)的方式似乎发生了行为变化。field:当查看OptionalFieldAttribute的文档 时,它在JSON序列化/反序列化的上下文中应该没有任何有意义的影响,因此应该被删除。以下代码通过生成 AreaCodeSingleResponse 记录实例列表来工作。OptionalFieldAttribute使问题中的代码起作用的最小修改是从字段中删除AreaCodeList

#r "nuget:Newtonsoft.Json,Version=13.0.2"

open System.Runtime.Serialization
open Newtonsoft.Json

[<DataContract>]
type AreaCodeSingleResponse = 
    { 
      [<DataMember(Name = "id")>]
      Id : string
      
      [<DataMember(Name = "code")>]
      Code : string
      
      [<DataMember(Name = "name")>]
      Name : string
      }

[<DataContract>]
type AreaCodeListResponse = 
    { 
      //Remove the OptionalFieldAttribute:
      //[<field:DataMember(Name = "areacode_list")>]
      [<DataMember(Name = "areacode_list")>]
      AreaCodeList : List<AreaCodeSingleResponse>
    }


let ReturnData = """{
    "areacode_list": [
        {
            "id": "00447",
            "code": "07",
            "name": "UK Mobile",
            "order_column": "_00447"
        },
        {
            "id": "0044113",
            "code": "0113",
            "name": "Leeds",
            "order_column": "0044113"
        }
    ]
}"""
ReturnData |> JsonConvert.DeserializeObject<AreaCodeListResponse> |> printf "%A"
Run Code Online (Sandbox Code Playgroud)

从 .Net 运行时 6.0.201 迁移到 .Net 7.0.101 时为什么会发生这种行为变化的问题仍然悬而未决。