Я хотел преобразовать некоторые документы yaml в json, используя Racket и библиотеки yaml и json. Оба, кажется, работают очень хорошо, но не обязательно работают вместе. С риском, что этот вопрос будет немного мета (меня интересует идиоматическое c решение), может ли кто-нибудь указать мне правильное направление?
Пример yaml:
Title: Example
Description: An example
Content:
Type1:
- foo
- bar
- baz
Type2:
- chocolate
- vanilla
- strawberry
Моя быстрая попытка конвертировать yaml:
#lang racket/base
(require json
yaml)
; reading is easy
(define example-yaml (file->yaml "./example.yaml"))
; writing doesn't like the keys-as-strings... why not?
; (write-json example-yaml)
; write-json: expected argument of type <legal JSON key value>; given: "Description"
; keys-as-symbols seems to be fine
(define example-yaml-2
#hash((Content
.
#hash((Type1 . ("foo" "bar" "baz"))
(Type2 . ("chocolate" "vanilla" "strawberry"))))
(Description . "An example")
(Title . "Example")))
(write-json example-yaml-2)
; {"Content":{"Type2":["chocolate","vanilla","strawberry"],"Type1":["foo","bar","baz"]},"Description":"An example","Title":"Example"}
Я понял, что проблема в том, что пакет json не видит строки как допустимый ключ в jsexpr. Документы дают следующий пример:
> (jsexpr? #hasheq(("turnip" . 82)))
#f
С того места, где я сижу, параметры выглядят следующим образом:
- Измените поведение пакета yaml для генерации ключи как символы, а не как строки
- Измените поведение пакета json, чтобы трактовать
(jsexpr? #hasheq(("turnip" . 82)))
как #t
- Разобрать мои yamls, а затем обработать полученную структуру данных так, чтобы ключи являются символами.
Полагаю, я не до конца понимаю последствия (или у меня есть solid дескриптор реализации) этих опций. Я также не совсем уверен, почему ключи как строки не являются допустимыми jsexprs, учитывая, что json, который он излучает, также использует строки в качестве ключей. Спасибо за любую информацию, которую вы можете предоставить!