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
| JSON | Value (naravni tip) | Tipizirane bralne metode |
|---|---|---|
| niz | String, nespremenjen | GetString 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 Long | Long | vse številske bralne metode; GetString vrne besedilo, kot je zapisano |
število brez decimalnega dela in eksponenta, zunaj obsega Long | Decimal | GetDecimal |
| število z decimalnim delom ali eksponentom | Double | GetDecimal, GetCurrency za natančne vrednosti (glejte Števila) |
true / false | Boolean | GetBoolean; GetString vrne „true“/„false“ |
null | Null | bralna metoda brez nadomestne vrednosti sproži napako, bralna metoda z nadomestno vrednostjo vrne nadomestno vrednost; StringValue vrne prazen niz |
| objekt, polje | ni vrednost: Value sproži jeInvalidOperation | GetString / 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 metoda | Sprejme | Z izgubo, brez napake | Zavrne 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 nize | zaokroženo na najbližji Double (15–17 veljavnih števk: 9007199254740993 se prebere kot 9007199254740992); absolutne vrednosti, manjše od približno 5E-324, postanejo 0 | vrednost zunaj ±1,8E308 (1e400) |
GetCurrency | števila, številske nize | zaokroženo na štiri decimalna mesta, polovice na sodo (kot CCur); absolutne vrednosti, manjše od 1E-28, postanejo 0 | vrednost zunaj ±922.337.203.685.477,5807 |
GetDecimal | števila, številske nize | zaokroženo na 28–29 veljavnih števk; absolutne vrednosti, manjše od 1E-28, postanejo 0 | vrednost zunaj ±79.228.162.514.264.337.593.543.950.335 |
GetDate | nize ISO 8601 (glejte Datumi) | decimalna mesta sekunde za sedmim se prezrejo | števila (tudi časovne žige Unix), druge nize, datume pred letom 100 |
GetBoolean | true/false; niza „true“/„false“ (ne glede na velike in male črke, tudi s presledki okrog); števila | - | druge nize, objekte, polja |
GetString | vsako 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 VBA | JSON |
|---|---|
String | niz |
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) |
Boolean | true / false |
Date | niz v obliki ISO 8601 (glejte Datumi) |
Empty, Null, Nothing | null |
vozlišče (JNode, JElement, JArray, JValue) | vozlišče; vozlišče drugega dokumenta se kopira |
JDoc | kopija njegovega korena; prazen JDoc da null |
| enodimenzionalno polje | polje, 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 argument | zavrnjeno 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:
GetDecimalinGetCurrencybesedilo pretvorita neposredno, ne prekDouble, zato0.1 + 0.2ostane natančno.Decimalhrani 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 primer1e-30) pa brez napake postane 0; take vrednosti berite zGetDouble.Currencyzaokroži na štiri decimalna mesta.Valueza cela števila vrneLongaliDecimal; celo število zunaj obsegaDecimal(približno 7,9 × 10^28) vrne kotDouble, z natančnostjo tipaDouble.- Število zunaj obsega
Double(1e400) je veljaven JSON; branje zValuealiGetDoublesprožijeTypeMismatch;GetStringvrne 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čje | Vedenje |
|---|---|
| Sintaksa | Strogo po RFC 8259: komentarji, končne vejice, enojni narekovaji, NaN in vodilne ničle so napake z navedbo vrstice in stolpca |
| Gnezdenje | največ 512 ravni; pri globljem gnezdenju LoadJson/Load vrne False s ParseError.ErrorCode = jeParseError |
| Podvojeni ključi | dovoljeni; obvelja zadnja vrednost, ključ obdrži položaj svoje prve pojavitve |
| Velikost | brez lastne omejitve; odloča pomnilnik |
| Unicode | poljubno besedilo; osamljena nadomestna kodna točka (\ud800) se prebere in znova zapiše kot ubežno zaporedje \u |
Load | UTF-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 |
Save | UTF-8 brez oznake vrstnega reda bajtov |
DateZone | vrednost 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-0in01ter 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 tipaValueType, uporabljena kot pogoj, pri vrednostifalseni izpolnjena. - Regularni izrazi.
matchinsearchuporabljata 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.
Pathvozlišč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
| Vir | Uporaba | Odstopanje |
|---|---|---|
| RFC 8259, JSON (internetni standard, 2017) | Sintaksa, ki jo sprejemata LoadJson/Load in zapisujeta Json/Save | Podvojena imena: RFC vedenja ne določa (imena naj bodo enolična, SHOULD); tu obvelja zadnja vrednost |
| RFC 9535, JSONPath (predlagani standard, 2024) | Izrazi JPath | razš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 9535 | ni izvedena (glejte zgoraj) |
| RFC 3339, datum in čas (2002), razdelek 5.6 | Časovni žigi, ki jih bere GetDate | sprejeto 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 ParseError | brez |