Как преобразовать объект в 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
Другие вопросы по тегам