2014-10-04 5 views
9

Я делаю небольшую веб-службу в Nim, и мне нужно ответить на запросы с помощью json. Я использую jester module, чтобы выполнить эту услугу. Я ожидаю, что я смогу использовать модуль json в базовой библиотеке Nim, чтобы построить какой-то объект с полями и значениями, а затем преобразовать его в строку json. Но как? Или есть лучший способ построить json в Nim?Как преобразовать объект в json в Nim

ответ

10

В Nim вы используете json module для создания JsonNode объектов, которые являются object variants. Они могут быть построены с отдельными процедурами, такими как newJObject(), а затем заполнять последовательность 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() 
21

Модуль маршал включает в себя общий алгоритм сериализации объекта до 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"} 
+0

Хотя Гжегож ответ был только то, что я искал, этот ответ был также очень полезен, интересен и проще, чем использование json-модуля. Круто! –

+0

Кажется, что в Ниме все делают операторов? – PascalVKooten

2

Другой вариант изложено мной here это сделать следующее:

import json 

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

var body = "" 

toUgly(body, jsonResponse) 

echo body 
Смежные вопросы