Color scheme: Riviera
You are here: start » sl » Dokumentacija » Orodja za Microsoft Access » WKL Office JSON » Vrednosti in omejitve

Vrednosti in omejitve

Ta stran opisuje, kako WKL Office JSON pretvarja vrednosti JSON v vrednosti VBA in nazaj ter kje so meje. JSON (RFC 8259) pozna nize, števila, true/false, null, objekte in polja; VBA pozna tipizirane vrednosti Variant. Tu je naveden vsak prehod med obema, skupaj s tem, kaj se pri tem izgubi in kaj je zavrnjeno. Strani članov v referenci API (v angleščini) se sklicujejo na to stran.

Iz JSON v VBA

JSONValue (naravni tip)Tipizirane bralne metode
nizString, nespremenjenGetString nespremenjen; GetDate bere ISO 8601 (glejte Datumi); GetBoolean bere „true“/„false“ (ne glede na velike in male črke, tudi s presledki okrog); GetLong in druge številske bralne metode berejo besedilo kot število
število brez decimalnega dela in eksponenta, v obsegu LongLongvse številske bralne metode; GetString vrne besedilo, kot je zapisano
število brez decimalnega dela in eksponenta, zunaj obsega LongDecimalGetDecimal
število z decimalnim delom ali eksponentomDoubleGetDecimal, GetCurrency za natančne vrednosti (glejte Števila)
true / falseBooleanGetBoolean; GetString vrne „true“/„false“
nullNullbralna metoda brez nadomestne vrednosti sproži napako, bralna metoda z nadomestno vrednostjo vrne nadomestno vrednost; StringValue vrne prazen niz
objekt, poljeni vrednost: Value sproži jeInvalidOperationGetString / StringValue vrneta strnjeno besedilo JSON

Nadomestna vrednost tipizirane bralne metode se pretvori v tip bralne metode po pravilih pretvorbe v VBA (VariantChangeType); nadomestna vrednost, ki je ni mogoče pretvoriti (na primer GetLong(path, "abc")), sproži jeTypeMismatch. GetValue vrne nadomestno vrednost nespremenjeno.

Tipizirane bralne metode: sprejeto, z izgubo, zavrnjeno

Bralna metodaSprejmeZ izgubo, brez napakeZavrne z jeTypeMismatch
GetLongštevila in številske nize s celo vrednostjo (12.0, 1e3)-decimalni del; vrednost zunaj obsega od −2.147.483.648 do 2.147.483.647
GetDoubleštevila, številske nizezaokroženo na najbližji Double (15–17 veljavnih števk: 9007199254740993 se prebere kot 9007199254740992); absolutne vrednosti, manjše od približno 5E-324, postanejo 0vrednost zunaj ±1,8E308 (1e400)
GetCurrencyštevila, številske nizezaokroženo na štiri decimalna mesta, polovice na sodo (kot CCur); absolutne vrednosti, manjše od 1E-28, postanejo 0vrednost zunaj ±922.337.203.685.477,5807
GetDecimalštevila, številske nizezaokroženo na 28–29 veljavnih števk; absolutne vrednosti, manjše od 1E-28, postanejo 0vrednost zunaj ±79.228.162.514.264.337.593.543.950.335
GetDatenize ISO 8601 (glejte Datumi)decimalna mesta sekunde za sedmim se prezrejoštevila (tudi časovne žige Unix), druge nize, datume pred letom 100
GetBooleantrue/false; niza „true“/„false“ (ne glede na velike in male črke, tudi s presledki okrog); števila-druge nize, objekte, polja
GetStringvsako vrednost; objekte in polja kot strnjeno besedilo JSON--

Niz se prebere kot število le, če je njegovo besedilo brez presledkov na začetku in koncu število JSON: "42" in " 4.2 " se prebereta; "007", "+5", ".5", "12,5" in "1 000" sprožijo jeTypeMismatch – take kode berite z GetString. Pri GetBoolean je število False, če je po pretvorbi v Decimal enako 0; to velja tudi za števila, manjša od 1E-28, kot je 1e-30 (drugače kot pri CBool), vsako drugo število, tudi zunaj obsega Decimal, pa je True.

Iz VBA v JSON

Kaj sprejmejo SetValue, Add, Insert in CreateValue (Value = … vozlišča z vrednostjo sprejme samo tiste vrednosti iz te tabele, ki nimajo podrejenih elementov, ali JValue; vozlišče s podrejenimi vozlišči, polje ali JDoc z objektom ali poljem kot korenom tam sproži jeInvalidOperation, Value = … na objektu ali polju pa vedno sproži jeInvalidOperation):

Vrednost VBAJSON
Stringniz
Byte, Integer, Long, LongLongštevilo
Singleštevilo, zapisano z najkrajšim besedilom vrednosti Single (0.1! postane 0.1); NaN in neskončnost sprožita jeUnsupportedValue
Doubleštevilo; NaN in neskončnost nimata oblike JSON in sprožita jeUnsupportedValue
Currencyštevilo, natančno, brez končnih ničel (CCur(12.50) se zapiše kot 12.5)
Decimalštevilo, natančno, s svojim številom decimalnih mest (CDec("12.50") se zapiše kot 12.50)
Booleantrue / false
Dateniz v obliki ISO 8601 (glejte Datumi)
Empty, Null, Nothingnull
vozlišče (JNode, JElement, JArray, JValue)vozlišče; vozlišče drugega dokumenta se kopira
JDockopija njegovega korena; prazen JDoc da null
enodimenzionalno poljepolje, element za elementom po teh pravilih; polje Byte() postane polje števil (ne Base64), polje brez dimenzij postane []
polje z več dimenzijami (na primer iz GetRows), vsak drug objekt, Error, manjkajoči izbirni argumentzavrnjeno z jeUnsupportedValue

Števila

Število ohrani besedilo, s katerim je bilo prebrano; Json, Save in GetString to besedilo zapišejo nespremenjeno, tudi 0.10, 1E3 ali število s 40 števkami. Zaokroži ali ne uspe lahko samo pretvorba v tip VBA:

  • GetDecimal in GetCurrency besedilo pretvorita neposredno, ne prek Double, zato 0.1 + 0.2 ostane natančno. Decimal hrani 28 do 29 veljavnih števk: število z več števkami se brez napake zaokroži na to natančnost, število z absolutno vrednostjo pod 1E-28 (na primer 1e-30) pa brez napake postane 0; take vrednosti berite z GetDouble. Currency zaokroži na štiri decimalna mesta.
  • Value za cela števila vrne Long ali Decimal; celo število zunaj obsega Decimal (približno 7,9 × 10^28) vrne kot Double, z natančnostjo tipa Double.
  • Število zunaj obsega Double (1e400) je veljaven JSON; branje z Value ali GetDouble sproži jeTypeMismatch; GetString vrne njegovo besedilo.

Datumi

JSON nima datumskega tipa; datumi se prenašajo kot nizi.

Branje (GetDate, DateValue) sprejme oblike, ki jih pošiljajo spletne storitve (profil RFC 3339 standarda ISO 8601): 2026-09-25, 2026-09-25T14:30, 2026-09-25T14:30:15, del sekunde s piko ali vejico (prebere se do sedem števk, preostale se prezrejo), vsakič po izbiri z dodanim Z, +02:00, +0200 ali +02. Namesto T je sprejet tudi presledek. Zavrnjeni so tedenski datumi in datumi z zaporedno številko dneva v letu, trajanja, sekunda 60, 24:00 ter datum brez časa, ki nosi časovni pas. Datum pred letom 100, s katerim se začnejo datumi VBA, sproži jeTypeMismatch. Kaj postane časovni žig s časovnim pasom, določa DateZone dokumenta: pretvorba v lokalni čas (privzeto), pretvorba v UTC ali vrednost, kot je zapisana (glejte Datumi in časovni pasovi). Lokalni čas uporablja pravila časovnih pasov, ki jih ima Windows za ta datum.

Pisanje da yyyy-MM-dd za datum ob polnoči, sicer yyyy-MM-ddTHH:mm:ss, z .fff, kadar ima vrednost milisekunde, vedno brez časovnega pasu. Čas VBA brez datuma (#14:30#) se zapiše z osnovnim datumom VBA, 1899-12-30T14:30:00.

Dokumenti

PodročjeVedenje
SintaksaStrogo po RFC 8259: komentarji, končne vejice, enojni narekovaji, NaN in vodilne ničle so napake z navedbo vrstice in stolpca
Gnezdenjenajveč 512 ravni; pri globljem gnezdenju LoadJson/Load vrne False s ParseError.ErrorCode = jeParseError
Podvojeni ključidovoljeni; obvelja zadnja vrednost, ključ obdrži položaj svoje prve pojavitve
Velikostbrez lastne omejitve; odloča pomnilnik
Unicodepoljubno besedilo; osamljena nadomestna kodna točka (\ud800) se prebere in znova zapiše kot ubežno zaporedje \u
LoadUTF-8 brez oznake vrstnega reda bajtov (BOM) ali UTF-8, UTF-16 ali UTF-32 z njo. Brez oznake vrstnega reda bajtov neveljaven UTF-8 povzroči, da Load vrne False s ParseError.ErrorCode = jeFileError; z oznako vrstnega reda bajtov se neveljavni bajti nadomestijo z U+FFFD in Load uspe
SaveUTF-8 brez oznake vrstnega reda bajtov
DateZonevrednost zunaj naštevanja sproži jeInvalidOperation

JPath

JPath izvaja sintakso in semantiko RFC 9535 (JSONPath). Razlike:

  • Razširitve. Pot brez $ se začne pri trenutnem vozlišču (na najvišji ravni tudi @); v kratkih imenih je dovoljen - ($.first-name); presledki okrog celotnega izraza se prezrejo; regularni izraz se ustavi po eni sekundi in nato vrne false.
  • Sprejeto, čeprav RFC 9535 zahteva napako. Funkcijski izrazi, ki niso pravilno tipizirani ($[?length(@.*) < 3], $[?length(@.a)], $[?match(@.a,'x') == true]), ! neposredno pred primerjavo, \' v nizu z dvojnimi narekovaji, indeksa -0 in 01 ter indeksi zunaj ±(2^53−1).
  • Drugačni rezultati. Nizi so urejeni po kodnih enotah UTF-16, ne po skalarnih vrednostih Unicode (razlika se pokaže le med znaki U+E000–U+FFFF in znaki nad U+FFFF). Števila se primerjajo kot Decimal: števila pod 1E-28 so enaka 0, števila, ki se razlikujejo šele za 28. veljavno števko, pa so enaka. Funkcija tipa ValueType, uporabljena kot pogoj, pri vrednosti false ni izpolnjena.
  • Regularni izrazi. match in search uporabljata regularne izraze .NET namesto I-Regexp (RFC 9485): . ustreza eni kodni enoti UTF-16 (emodži potrebuje dve) in tudi znaku CR; \d, \w, \s, povratni sklici in pogledi naprej oziroma nazaj (look-around) so sprejeti. Neveljaven vzorec vrne false, kot zahteva razdelek 2.4.6 RFC 9535.
  • Poti. Path vozlišča vrne izraz te knjižnice v zapisu s piko, kjer ime to dopušča, sicer ['name'] ($.lines[2].no, $['first name']), ne oklepajske oblike normalizirane poti (Normalized Path, RFC 9535, razdelek 2.7).

Prevedeni izrazi se hranijo v predpomnilniku s 512 vnosi.

Niti in različice

Objekti so objekti COM modela apartment: ustvarite in uporabljajte jih v eni niti, tako kot to počne VBA; za druge gostitelje niso varni pri hkratni uporabi iz več niti.

Podprta konfiguracija: 32- in 64-bitni Microsoft 365 Access 16.0 (ACCDB, ACCDE in Access Runtime) v sistemu Windows 11. Druge različice programa Access (2016, 2019, 2021, LTSC) in druge različice sistema Windows v tej izdaji niso podprte.

Standardi

VirUporabaOdstopanje
RFC 8259, JSON (internetni standard, 2017)Sintaksa, ki jo sprejemata LoadJson/Load in zapisujeta Json/SavePodvojena imena: RFC vedenja ne določa (imena naj bodo enolična, SHOULD); tu obvelja zadnja vrednost
RFC 9535, JSONPath (predlagani standard, 2024)Izrazi JPathrazširitve, popustljivo sprejemanje, vrstni red nizov, primerjava števil, regularni izrazi in Path: glejte JPath
RFC 9485, I-Regexp (predlagani standard, 2023)Različica regularnih izrazov, ki jo predpisuje RFC 9535ni izvedena (glejte zgoraj)
RFC 3339, datum in čas (2002), razdelek 5.6Časovni žigi, ki jih bere GetDatesprejeto tudi: presledek namesto T, zamiki +0200/+02, vejica kot decimalno ločilo
MSXML `loadXML`)Zgled za LoadJson: ob neveljavnem besedilu vrne False, razlog je v ParseErrorbrez

Sorodne teme

sl/wiki/msaccess/json/values-and-limits.txt · Last modified: by Wolfgang van der Stille