我正在Nim中创建一个小型Web服务,我需要用json响应请求.我正在使用jester模块来提供服务.我希望我可以在Nim的基础库中使用json模块来构造某种带有字段和值的对象,然后将其转换为json字符串.但是怎么样?或者有更好的方法在Nim中构建json吗?
zah*_*zah 24
编组模块包括一个适用于任何类型的通用对象到json序列化算法(目前,它使用运行时类型内省).
import marshal
type
Person = object
age: int
name: string
var p = Person(age: 38, name: "Torbjørn")
echo($$p)
Run Code Online (Sandbox Code Playgroud)
输出将是:
{"age": 38, "name": "Torbj\u00F8rn"}
Run Code Online (Sandbox Code Playgroud)
Grz*_*icz 11
在Nim中,您使用json模块创建对象变体JsonNode的对象.这些可以使用newJObject()等单独的proc构造,然后填充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()
Run Code Online (Sandbox Code Playgroud)
对于其他发现marshal。使用这个代替:
import json\n\ntype\n Person = object\n age: int\n name: string\n\nvar p = Person(age: 38, name: "Torbj\xc3\xb8rn")\necho(%p)\nRun Code Online (Sandbox Code Playgroud)\n请注意,您不应该用于marshal此目的,它相当于picklePython 中的模块,并且它可能会生成包含您可能不想要的额外数据的 JSON。另外,现在它生成 JSON 只是巧合,将来可能会选择不同的格式。
| 归档时间: |
|
| 查看次数: |
1664 次 |
| 最近记录: |