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# 专家,只是在处理一些遗留代码时才开始使用它。
.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 时为什么会发生这种行为变化的问题仍然悬而未决。
| 归档时间: |
|
| 查看次数: |
320 次 |
| 最近记录: |