std/jsonutils
Источник РедактироватьЭтот модуль реализует привязку (де)сериализации произвольных типов с использованием JSON. Цель разработки: избежать импорта модулей, где нужна пользовательская сериализация; см. strtabs.fromJsonHook,toJsonHook для примера.
Пример:
import std/jsonutils
import std/[strtabs,json]
type Foo = ref object
t: bool
z1: int8
let a = (1.5'f32, (b: "b2", a: "a2"), 'x', @[Foo(t: true, z1: -3), nil], [{"name": "John"}.newStringTable])
let j = a.toJson
assert j.jsonTo(typeof(a)).toJson == j
assert $[NaN, Inf, -Inf, 0.0, -0.0, 1.0, 1e-2].toJson == """["nan","inf","-inf",0.0,-0.0,1.0,0.01]"""
assert 0.0.toJson.kind == JFloat
assert Inf.toJson.kind == JString Импорты
- json, strutils, таблицы, множества, strtabs, options, strformat, макросы, enumutils, typetraits
Типы
EnumMode = enum joptEnumOrd, joptEnumSymbol, joptEnumString
- Источник Редактировать
Joptions = object allowExtraKeys*: bool ## If `true` Nim's object to which the JSON is parsed is not required to ## have a field for every JSON key. allowMissingKeys*: bool ## If `true` Nim's object to which JSON is parsed is allowed to have ## fields without corresponding JSON keys.- Параметры, контролирующие поведение
fromJson. Источник Редактировать JsonNodeMode = enum joptJsonNodeAsRef, ## returns the ref as is joptJsonNodeAsCopy, ## returns a deep copy of the JsonNode joptJsonNodeAsObject ## treats JsonNode as a regular ref object
- управляет
toJsonдля типов JsonNode Источник Редактировать ToJsonOptions = object enumMode*: EnumMode jsonNodeMode*: JsonNodeMode
- Источник Редактировать
Процедуры
proc fromJson[T](a: var T; b: JsonNode; opt = Joptions())
- Источник Редактировать
proc fromJsonHook(a: var StringTableRef; b: JsonNode) {. ...raises: [ValueError, KeyError, JsonKindError], tags: [RootEffect], forbids: [].}-
Включает
fromJsonдля типаStringTableRef.См. также:
Пример:
import std/[strtabs, json] var t = newStringTable(modeCaseSensitive) let jsonStr = """{"mode": 0, "table": {"name": "John", "surname": "Doe"}}""" fromJsonHook(t, parseJson(jsonStr)) assert t[] == newStringTable("name", "John", "surname", "Doe", modeCaseSensitive)[]Источник Редактировать proc fromJsonHook[A](s: var SomeSet[A]; jsonNode: JsonNode; opt = Joptions())
-
Включает
fromJsonдля типовHashSetиOrderedSet.См. также:
Пример:
import std/[sets, json] var foo: tuple[hs: HashSet[string], os: OrderedSet[string]] fromJson(foo, parseJson(""" {"hs": ["hash", "set"], "os": ["ordered", "set"]}""")) assert foo.hs == ["hash", "set"].toHashSet assert foo.os == ["ordered", "set"].toOrderedSetИсточник Редактировать proc fromJsonHook[K: string | cstring; V]( t: var (Table[K, V] | OrderedTable[K, V]); jsonNode: JsonNode; opt = Joptions())-
Включает
fromJsonдля типовTableиOrderedTable.См. также:
Пример:
import std/[tables, json] var foo: tuple[t: Table[string, int], ot: OrderedTable[string, int]] fromJson(foo, parseJson(""" {"t":{"two":2,"one":1},"ot":{"one":1,"three":3}}""")) assert foo.t == [("one", 1), ("two", 2)].toTable assert foo.ot == [("one", 1), ("three", 3)].toOrderedTableИсточник Редактировать proc fromJsonHook[T](self: var Option[T]; jsonNode: JsonNode; opt = Joptions())
-
Включает
fromJsonдля типовOption.См. также:
Пример:
import std/[options, json] var opt: Option[string] fromJsonHook(opt, parseJson("\"test\"")) assert get(opt) == "test" fromJson(opt, parseJson("null")) assert isNone(opt)Источник Редактировать proc initToJsonOptions(): ToJsonOptions {....raises: [], tags: [], forbids: [].}- инициализирует
ToJsonOptionsс разумными параметрами. Источник Редактировать proc jsonTo(b: JsonNode; T: typedesc; opt = Joptions()): T:type
- Обратная операция
toJsonИсточник Редактировать proc toJson[T](a: T; opt = initToJsonOptions()): JsonNode
- Сериализует
aв json; используетtoJsonHook(a: T), если оно доступно, для настройки сериализации, см. strtabs.toJsonHook для примера.Примечание: СИсточник Редактировать-d:nimPreviewJsonutilsHoleyEnum,toJsonтеперь может сериализовать/десериализовать прореженные перечисления как обычные перечисления (черезord) вместо строк. Ожидается, что это поведение станет новым по умолчанию в будущих версиях. proc toJsonHook(a: StringTableRef): JsonNode {....raises: [], tags: [], forbids: [].}-
Включает
toJsonдля типаStringTableRef.См. также:
Пример:
import std/[strtabs, json] let t = newStringTable("name", "John", "surname", "Doe", modeCaseSensitive) let jsonStr = """{"mode": "modeCaseSensitive", "table": {"name": "John", "surname": "Doe"}}""" assert toJson(t) == parseJson(jsonStr)Источник Редактировать proc toJsonHook[A](s: SomeSet[A]; opt = initToJsonOptions()): JsonNode
-
Включает
toJsonдля типовHashSetиOrderedSet.См. также:
Пример:
import std/[sets, json] let foo = (hs: ["hash"].toHashSet, os: ["ordered", "set"].toOrderedSet) assert $toJson(foo) == """{"hs":["hash"],"os":["ordered","set"]}"""Источник Редактировать proc toJsonHook[K: string | cstring; V](t: (Table[K, V] | OrderedTable[K, V]); opt = initToJsonOptions()): JsonNode-
Включает
toJsonдля типовTableиOrderedTable.См. также:
Пример:
import std/[tables, json, sugar] let foo = ( t: [("two", 2)].toTable, ot: [("one", 1), ("three", 3)].toOrderedTable) assert $toJson(foo) == """{"t":{"two":2},"ot":{"one":1,"three":3}}""" # if keys are not string|cstring, you can use this: let a = {10: "foo", 11: "bar"}.newOrderedTable let a2 = collect: (for k,v in a: (k,v)) assert $toJson(a2) == """[[10,"foo"],[11,"bar"]]"""Источник Редактировать proc toJsonHook[T](self: Option[T]; opt = initToJsonOptions()): JsonNode
-
Включает
toJsonдля типовOption.См. также:
Пример:
import std/[options, json] let optSome = some("test") assert $toJson(optSome) == "\"test\"" let optNone = none[string]() assert $toJson(optNone) == "null"Источник Редактировать
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/jsonutils.html