如何在Nim中将对象转换为json

Tor*_*ørn 9 json nim-lang

我正在Nim中创建一个小型Web服务,我需要用json响应请求.我正在使用jester模块来提供服务.我希望我可以在Nim的基础库中使用json模块来构造某种带有字段和值的对象,然后将其转换为json字符串.但是怎么样?或者有更好的方法在Nim中构建json吗?

zah*_*zah 24

编组模块包括一个适用于任何类型的通用对象到json序列化算法(目前,它使用运行时类型内省).

import marshal

type
  Person = object
    age: int
    name: string

var p = Person(age: 38, name: "Torbjørn")

echo($$p)
Run Code Online (Sandbox Code Playgroud)

输出将是:

{"age": 38, "name": "Torbj\u00F8rn"}
Run Code Online (Sandbox Code Playgroud)

  • 这不是您在 Nim 中序列化为 JSON 的方式。`marshal` 模块相当于 Python 的 `pickle`,它使用 JSON 作为序列化格式纯属巧合,不要用它来将对象序列化为 JSON。这是你不应该做的事情,因为“json”模块有效地支持相同的事情:https://play.nim-lang.org/#ix=2uPe (3认同)

Grz*_*icz 11

在Nim中,您使用json模块创建对象变体JsonNode对象.这些可以使用newJObject()等单独的proc构造,然后填充fields序列.另一种更快捷的方法是使用%()proc接受一系列元组,其中一个值是带有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()
Run Code Online (Sandbox Code Playgroud)

  • 抱歉,这是一种生成 JSON 的糟糕方法,现在没有人通过手动编写序列化函数来生成它 (2认同)

dom*_*m96 8

对于其他发现marshal。使用这个代替:

\n
import json\n\ntype\n  Person = object\n    age: int\n    name: string\n\nvar p = Person(age: 38, name: "Torbj\xc3\xb8rn")\necho(%p)\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,您不应该用于marshal此目的,它相当于picklePython 中的模块,并且它可能会生成包含您可能不想要的额外数据的 JSON。另外,现在它生成 JSON 只是巧合,将来可能会选择不同的格式。

\n

  • 好吧,我刚刚尝试了一下,确实有效 https://play.nim-lang.org/#ix=2uPX ...这很好 (2认同)