学科
对于错误,api返回两种结果,一种是字段error
,对于某些error_code
,并且api可以基于参数返回两种结果,因此无法真正分支。
Deserialize datamember multiple names (C#)
JSON 1
{
"error_code": "234",
"message": "Api Key is required"
}
JSON 2
{
"code": "NotFound",
"message": "Could not find the resource"
}
码
[<DataContract>]
type Error = {
[<field: DataMemberAttribute(Name="code",Name="error_code")>]
code: string
[<field: DataMemberAttribute(Name="message")>]
message: string
}
错误
命名参数已分配了多个值
预期解决方案
如果相同,则错误类型可以处理两种类型的JSON输出。
根据给定的答案进行编辑。
[<DataContract>]
type Error = {
[<field: DataMemberAttribute(Name="code")>]
code: string
[<field: DataMemberAttribute(Name="error_code")>]
error_code: string
[<field: DataMemberAttribute(Name="message")>]
Message: string
}
with member this.Code : string =
if not (String.IsNullOrEmpty(this.code)) then this.code
else if not (String.IsNullOrEmpty(this.error_code)) then this.error_code
else ""
最佳答案
我认为这对于F#记录类型不是直接可行的,但是取决于反序列化器的行为,您可能可以执行以下操作:
[<DataContract>]
type Error = {
[<field: DataMemberAttribute(Name="error_code")>]
numericCode: string
[<field: DataMemberAttribute(Name="code")>]
textCode: string
[<field: DataMemberAttribute(Name="message")>]
message: string
}
with member this.code =
if not (String.IsNullOrEmpty(this.numericCode)) then Some this.numericCode
else if not (String.IsNullOrEmpty(this.textCode)) then Some this.textCode
else None
这样,您仍然必须显式地处理类型中的不同情况,但是它允许您仅从代码中调用
error.code
而不用担心两个单独的字段。根据您使用的解串器库,您可能可以使用访问修饰符来隐藏两个字段(但是对于记录来说可能不切实际)或将它们的类型设为
Option<string>
,以便类型消费者知道他们应该处理缺失值。如果您指定具有不同字段的多个示例,这也是FSharp.Data的JsonProvider所做的:它将它们合并在一起以创建一个能够代表所有示例的类型,并为所有示例中不存在的值提供可选字段。然后由您编写帮助程序功能或为应用程序特定的映射键入扩展名。
关于f# - 多个DataMemberAttribute,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49345307/