Как преобразовать объект в JSON в Nim
Я делаю небольшой веб-сервис в Nim, и мне нужно отвечать на запросы с помощью json. Я использую модуль шута, чтобы сделать сервис. Я ожидаю, что смогу использовать модуль json в базовой библиотеке Nim для создания какого-либо объекта с полями и значениями, а затем преобразовать его в строку json. Но как? Или есть лучший способ построить JSON в Nim?
3 ответа
В Nim вы используете модуль json для создания JsonNode
объекты, которые являются вариантами объекта. Их можно создать с помощью отдельных процедур, таких как newJObject(), а затем заполнить fields
последовательность. Другой более быстрый способ - использовать процедуру %(), которая принимает последовательность кортежей, где одно значение является строкой с полем json, а другое - индивидуальным JsonNode
,
Вот пример, показывающий оба способа:
import json
type
Person = object ## Our generic person record.
age: int ## The age of the person.
name: string ## The name of the person.
proc `%`(p: Person): JsonNode =
## Quick wrapper around the generic JObject constructor.
result = %[("age", %p.age), ("name", %p.name)]
proc myCustomJson(p: Person): JsonNode =
## Custom method where we replicate manual construction.
result = newJObject()
# Initialize empty sequence with expected field tuples.
var s: seq[tuple[key: string, val: JsonNode]] = @[]
# Add the integer field tuple to the sequence of values.
s.add(("age", newJInt(p.age)))
# Add the string field tuple to the sequence of values.
s.add(("name", newJString(p.name)))
result.fields = s
proc test() =
# Tests making some jsons.
var p: Person
p.age = 24
p.name = "Minah"
echo(%p) # { "age": 24, "name": "Minah"}
p.age = 33
p.name = "Sojin"
echo(%p) # { "age": 33, "name": "Sojin"}
p.age = 40
p.name = "Britney"
echo p.myCustomJson # { "age": 40, "name": "Britney"}
when isMainModule: test()
Модуль маршала включает в себя универсальный алгоритм сериализации объект-json, который работает для любого типа (в настоящее время он использует интроспекцию типа во время выполнения).
import marshal
type
Person = object
age: int
name: string
var p = Person(age: 38, name: "Torbjørn")
echo($$p)
Выход будет:
{"age": 38, "name": "Torbj\u00F8rn"}
Для всех, кто нашел marshal
основанный на ответе в этой теме. Используйте вместо этого:
import json
type
Person = object
age: int
name: string
var p = Person(age: 38, name: "Torbjørn")
echo(%p)
Обратите внимание, что вам не следует использовать marshal
для этой цели это эквивалент pickle
модуль в Python, и он может генерировать JSON с дополнительными данными, которые вам, вероятно, не нужны. Кроме того, прямо сейчас это просто совпадение, что он генерирует JSON, он может выбрать другой формат в будущем.
Другой вариант, изложенный мной здесь, заключается в следующем:
import json
var jsonResponse = %*
{"data": [{ "id": 35,
"type": "car",
"attributes": {"color":"red"} }]}
var body = ""
toUgly(body, jsonResponse)
echo body