nim-lang - 如何在 Nim 中将对象序列转换为 JSON?

标签 nim-lang

我正在尝试将对象列表转换为 JSON,但无法正确序列化

import marshal

type
  DocItem = object of RootObj
    tags: seq[string]

  TextDoc = object of DocItem
    text: string

  TodoDoc = object of DocItem
    todo: string

var docs: seq[ref DocItem]

proc to_ref[T](o: T): ref T =
  result.new
  result[] = o

docs.add TextDoc(text: "some doc", tags: @["help"]).to_ref
docs.add TodoDoc(todo: "some todo").to_ref

echo $$docs

输出是:

[[4312834120, {"tags": ["help"]}], [4312834280, {"tags": []}]]

当我需要它的时候

[{"text": "some doc", "tags": ["help"]}, {"todo": "some todo", "tags": []}]

还有,有没有办法配置marshal输出漂亮的JSON?

最佳答案

不幸的是,编码似乎是正确的:它显示了指向 ref Object 的指针。也许您可以求助于组合而不是继承:

import marshal


type
  Todo = object of RootObj
    todo: string

  Text = object of RootObj
    text: string

  DocItem = object of RootObj
    tags: seq[string]
    text: Text
    todo: Todo

var docs: seq[DocItem] = @[]

docs.add DocItem(tags: @["help"], todo: Todo(todo: "some todo"))
docs.add DocItem(tags: @["help"], text: Text(text: "some text"))

echo $$docs

或者您可以尝试 object variants .我正在添加一个新的虚构的“链接”类型来更好地说明它:

import marshal


type
  Content = enum
    tTodo
    tText
    tImage

  DocItem = object of RootObj
    tags: seq[string]
    case kind: Content
    of tTodo, tText:
      text: string
    of tLink:
      url: string

var docs: seq[DocItem] = @[]

docs.add DocItem(tags: @["help"], kind: tTodo, todoVal: "some todo")
docs.add DocItem(tags: @["help"], kind: tText, textVal: "some text")
docs.add DocItem(tags: @["help"], kind: tLink, url: "http://stackoverflow.com")

echo $$docs

关于nim-lang - 如何在 Nim 中将对象序列转换为 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63492720/

相关文章:

nim-lang - "Error: Undeclared identifier"尝试从过程返回 <Node> 时

syntax - 尼姆 : Meaning of exclamation mark before a string constant

vb6 - 使用 Nim 创建返回字符串的 vb6 dll

functional-programming - 在 nim 中传递函数

nim-lang - Nim 中的 Pythonic dir(module_name)?

nim-lang - 如何为在 Nim 中编译失败的代码编写单元测试?

nim-lang - Nim 必须将字符串转换为最简单的 int

nim-lang - 我可以解压缩 `varargs` 以用作 nim 的单个过程调用参数吗?

nim-lang - 尼姆 : work with read-only memory mapped files

macros - 如何创建 nnkUInt16Lit NimNode