2014-10-04 25 views
9

Tôi đang tạo một dịch vụ web nhỏ trong Nim và tôi cần trả lời các yêu cầu bằng json. Tôi đang sử dụng jester module để thực hiện dịch vụ. Tôi hy vọng tôi có thể sử dụng các mô-đun json trong thư viện cơ sở của Nim để xây dựng một số loại đối tượng với các lĩnh vực và giá trị, và sau đó chuyển đổi nó thành một chuỗi json. Nhưng bằng cách nào? Hoặc là có một cách tốt hơn để xây dựng json trong Nim?Cách chuyển đổi đối tượng thành json trong Nim

Trả lời

10

Trong Nim bạn sử dụng json module để tạo các đối tượng JsonNodeobject variants. Đây có thể được xây dựng với các procs cá nhân như newJObject() và sau đó điền trình tự fields. Một cách nhanh hơn là sử dụng %() proc chấp nhận một chuỗi các bộ dữ liệu trong đó một giá trị là chuỗi có trường json và một giá trị khác là cá nhân JsonNode.

Dưới đây là một ví dụ cho thấy cả hai cách:

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

Module soái bao gồm một đối tượng-to-json thuật toán tuần tự chung mà làm việc cho bất kỳ loại (hiện tại, nó sử dụng thời gian chạy loại mẫn).

import marshal 

type 
    Person = object 
    age: int 
    name: string 

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

echo($$p) 

Kết quả sẽ là:

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

Trong khi Grzegorz câu trả lời là chỉ là những gì tôi đang tìm kiếm, câu trả lời này cũng rất hữu ích, thú vị và đơn giản hơn việc sử dụng mô-đun json. Mát mẻ! –

+0

Dường như trong Nim mọi người đều khai thác? – PascalVKooten

2

Một tùy chọn khác vạch ra bởi tôi here là phải làm như sau:

import json 

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

var body = "" 

toUgly(body, jsonResponse) 

echo body 
Các vấn đề liên quan