微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在Nim中将对象序列转换为JSON?

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

db.talents.aggregate([
  {
    $match: {
      category: { $in: ["5f19359250bcf9158c6be573","5f19357b50bcf9158c6be572"] }
    }
  },{
    $lookup: {
      from: "users",as: "users",let: { userId: "$userId" },pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                { $eq: ["$$userId","$_id"] },{ $eq: ["$gender","Male"] },{ $eq: ["$education","Btech"] }
                // ... add you other match criteria here 
              ]
            }
          }
        }
      ]
    }
  },{ $match: { users: { $ne: [] } } }
])

输出为:

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": []}] 输出漂亮的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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。