14

私は Nim で小さな Web サービスを作成しており、json でリクエストに応答する必要があります。jester モジュールを使用してサービスを作成しています。Nim の基本ライブラリの json モジュールを使用して、フィールドと値を持つある種のオブジェクトを構築し、それを json 文字列に変換できると思います。しかし、どのように?または、Nim で json を構築するためのより良い方法はありますか?

4

4 に答える 4

26

marshal モジュールには、任意の型に対して機能する汎用の object-to-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"}
于 2014-10-04T16:37:09.563 に答える
11

Nim では、json モジュールを使用してオブジェクト バリアントJsonNodeであるオブジェクトを作成します。これらは、newJObject()などの個々の proc で構築してから、シーケンスに入力できます。別のより迅速な方法は、タプルのシーケンスを受け入れる%() プロシージャを使用することです。1 つの値は json フィールドを持つ文字列で、もう 1 つは個々のです。fieldsJsonNode

両方の方法を示す例を次に示します。

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()
于 2014-10-04T10:17:05.183 に答える
2

以下をせよ:

import json

var jsonResponse = %*
                   {"data": [{ "id": 35,
                               "type": "car",
                               "attributes": {"color":"red"} }]}

var body = ""

toUgly(body, jsonResponse)

echo body
于 2016-06-27T18:34:45.823 に答える