Как получить доступ к свойствам ExpandoObject с помощью F #? - PullRequest
0 голосов
/ 09 декабря 2018

Я использую библиотеку Flurl для вызова веб-службы, которая возвращает 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 содержит объект ("System.Dynamic.ExpandoObject")

Как получить, например, значение success этого объекта в переменной j?А как получить доступ к данным ?

Visual Studio 2019 Screenshot

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Вы можете использовать предопределенный оператор ? для всех ваших потребностей взаимодействия с DynamicObject с помощью fsprojects / FSharp.Interop.Dynamic

open FSharp.Interop.Dynamic
let ex1 = ExpandoObject()
ex1?Test<-"Hi"//Set Dynamic Property
ex1?Test //Get Dynamic
0 голосов
/ 09 декабря 2018

У меня нет опыта работы с этой конкретной библиотекой, но если результат является просто нормальным 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, потому что тогда вы можете просто заменить все динамические небезопасные ? доступы проверенными типами!

...