学科

对于错误,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/

10-11 23:15
查看更多