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
9
A
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"}
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
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! –
Wygląda na to, że w Nim każdy robi operatorów? – PascalVKooten