2014-10-04 25 views
9

Tworzę mały serwis internetowy w Nim i muszę odpowiadać na żądania z jsonem. Używam usługi jester module do świadczenia usługi. Oczekuję, że będę mógł użyć modułu json w bibliotece podstawowej Nima do skonstruowania jakiegoś obiektu z polami i wartościami, a następnie przekonwertować go na ciąg json. Ale jak? Czy istnieje lepszy sposób na skonstruowanie json w Nim?Jak przekonwertować obiekt do json w Nim

Odpowiedz

10

W Nim używa się json module do tworzenia obiektów JsonNode, które są object variants. Można je skonstruować z pojedynczymi procesami, takimi jak newJObject(), a następnie zapełnić sekwencję fields. Innym szybszym sposobem jest użycie %() proc, która akceptuje sekwencję krotek, gdzie jedną wartością jest ciąg znaków z polem json, a drugą jednostką JsonNode.

Oto przykład pokazujący w obie strony:

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

Moduł marszałek zawiera ogólny algorytm szeregowania obiekt-json, który pracuje dla każdego typu (typ Obecnie używa run-time introspekcji).

import marshal 

type 
    Person = object 
    age: int 
    name: string 

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

echo($$p) 

wyjście będzie:

{"age": 38, "name": "Torbj\u00F8rn"} 
+0

Choć Grzegorz odpowiedzią było to, czego szukałem, tę odpowiedź był również bardzo użyteczny, interesujący i prostszy niż przy użyciu modułu json. Chłodny! –

+0

Wygląda na to, że w Nim każdy robi operatorów? – PascalVKooten

2

Inną opcją opisane przeze mnie here to zrobić następujące:

import json 

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

var body = "" 

toUgly(body, jsonResponse) 

echo body 
Powiązane problemy