【问题标题】:How to access ExpandoObject properties using F#?如何使用 F# 访问 ExpandoObject 属性?
【发布时间】:2018-12-08 22:17:36
【问题描述】:

我正在使用 Flurl 库调用一个 web 服务,它返回一个 JSON

{"data":{"charges":[{"code":30200757,"reference":"","dueDate":"18/12/2018","checkoutUrl":"https://sandbox.boletobancario.com/boletofacil/checkout/C238E9C42A372D25FDE214AE3CF4CB80FD37E71040CBCF50","link":"https://sandbox.boletobancario.com/boletofacil/charge/boleto.pdf?token=366800:m:3ea89b5c6579ec18fcd8ad37f07d178f66d0b0eb45d5e67b884894a8422f23c2","installmentLink":"https://sandbox.boletobancario.com/boletofacil/charge/boleto.pdf?token=30200757:10829e9ba07ea6262c2a2824b36c62e7c5782a43c855a1004071d653dee39af0","payNumber":"BOLETO TESTE - Não é válido para pagamento","billetDetails":{"bankAccount":"0655/46480-8","ourNumber":"176/30200757-1","barcodeNumber":"34192774200000123001763020075710655464808000","portfolio":"176"}}]},"success":true}

这是我的 F# 代码:

let c = "https://sandbox.boletobancario.com/boletofacil/integration/api/v1/"
        .AppendPathSegment("issue-charge")
        .SetQueryParams(map)
        .GetJsonAsync()

c.Wait()
let j = c.Result
let success = j?success

我检查了一下,变量 j 包含一个 obj ("System.Dynamic.ExpandoObject")

如何访问变量 j 中这个 obj 的 success 值? 以及如何访问数据

【问题讨论】:

    标签: f# flurl


    【解决方案1】:

    我没有使用那个特定库的经验,但如果结果只是一个普通的ExpandoObject,那么下面应该可以解决问题。

    首先,ExpandoObject 实现了IDictionary<string, obj>,因此您可以将值转换为IDictionary,然后根据需要添加或获取成员:

    open System.Dynamic
    open System.Collections.Generic
    
    let exp = ExpandoObject() 
    
    // Adding and getting properties using a dictionary    
    let d = exp :> IDictionary<string, obj>
    d.Add("hi", 123)
    d.["hi"]
    

    如果你想使用?语法,你可以自己定义?操作符,和上面的完全一样:

    let (?) (exp:ExpandoObject) s = 
      let d = exp :> IDictionary<string, obj>
      d.[s]
    
    exp?hi
    

    也就是说,如果您可以使用类型提供程序,那么使用 F# Data 进行 JSON 解析会更容易,因为您可以将所有动态不安全的 ? 访问替换为类型检查那些!

    【讨论】:

      【解决方案2】:

      您可以使用预定义的 ? 运算符来满足您与 fsprojects/FSharp.Interop.Dynamic 的所有 DynamicObject 互操作需求

      open FSharp.Interop.Dynamic
      let ex1 = ExpandoObject()
      ex1?Test<-"Hi"//Set Dynamic Property
      ex1?Test //Get Dynamic
      

      【讨论】:

        猜你喜欢
        • 2021-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-12
        • 2011-02-23
        • 2020-06-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多