Записать в текст - PullRequest
       8

Записать в текст

0 голосов
/ 11 февраля 2020

Я ищу Dhall-эквивалент Java toString, чтобы я мог вставить необработанный JSON в другую запись, но я sh, чтобы убедиться, что полученная структура JSON действительна.

У меня есть запись, например, { name : Text, age : Natural } и wi sh для преобразования значения в текст, например:

let friends = 
[ { name = "Bob", age = 25 }, { name = "Alice", age = 24 }]
in { id = "MyFriends", data = Record/toString friends }

, которая выдаст:

{
  "id": "MyFriends, 
  "data": "[ { \"name\": \"Bob\", \"age\": 25 }, { \"name\": \"Alice\", \"age\": 24 }]" 
}

Возможно ли это в Далле?

1 Ответ

1 голос
/ 13 февраля 2020

Преобразование в JSON не может быть получено автоматически, но вы можете использовать поддержку Prelude для JSON для генерации строк с корректным построением JSON (это означает, что они никогда не будут искажены), как это :

let Prelude = https://prelude.dhall-lang.org/v13.0.0/package.dhall

let Friend = { name : Text, age : Natural }

let Friend/ToJSON
    : Friend → Prelude.JSON.Type
    =   λ(friend : Friend)
      → Prelude.JSON.object
          ( toMap
              { name = Prelude.JSON.string friend.name
              , age = Prelude.JSON.natural friend.age
              }
          )

let Friends/ToJSON
    : List Friend → Prelude.JSON.Type
    =   λ(friends : List Friend)
      → Prelude.JSON.array
          (Prelude.List.map Friend Prelude.JSON.Type Friend/ToJSON friends)

let friends = [ { name = "Bob", age = 25 }, { name = "Alice", age = 24 } ]

in  { id = "MyFriends", data = Prelude.JSON.render (Friends/ToJSON friends) }

Это дает следующий результат:

{ data =
    "[ { \"age\": 25, \"name\": \"Bob\" }, { \"age\": 24, \"name\": \"Alice\" } ]"
, id = "MyFriends"
}
...