mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-19 05:50:30 +00:00
@@ -47,6 +47,10 @@ type
|
||||
- Added `system.getOsFileHandle` which is usually more useful
|
||||
than `system.getFileHandle`. This distinction is only meaningful on
|
||||
Windows.
|
||||
- Added a `json.parseJsonFragments` iterator that can be used to speedup
|
||||
JSON processing substantially when there are JSON fragments separated
|
||||
by whitespace.
|
||||
|
||||
|
||||
## Library changes
|
||||
|
||||
|
||||
@@ -841,10 +841,27 @@ proc parseJson(p: var JsonParser): JsonNode =
|
||||
raiseParseErr(p, "{")
|
||||
|
||||
when not defined(js):
|
||||
iterator parseJsonFragments*(s: Stream, filename: string = ""): JsonNode =
|
||||
## Parses from a stream `s` into `JsonNodes`. `filename` is only needed
|
||||
## for nice error messages.
|
||||
## The JSON fragments are separated by whitespace. This can be substantially
|
||||
## faster than the comparable loop
|
||||
## ``for x in splitWhitespace(s): yield parseJson(x)``.
|
||||
## This closes the stream `s` after it's done.
|
||||
var p: JsonParser
|
||||
p.open(s, filename)
|
||||
try:
|
||||
discard getTok(p) # read first token
|
||||
while p.tok != tkEof:
|
||||
yield p.parseJson()
|
||||
finally:
|
||||
p.close()
|
||||
|
||||
proc parseJson*(s: Stream, filename: string = ""): JsonNode =
|
||||
## Parses from a stream `s` into a `JsonNode`. `filename` is only needed
|
||||
## for nice error messages.
|
||||
## If `s` contains extra data, it will raise `JsonParsingError`.
|
||||
## This closes the stream `s` after it's done.
|
||||
var p: JsonParser
|
||||
p.open(s, filename)
|
||||
try:
|
||||
@@ -1778,3 +1795,11 @@ when isMainModule:
|
||||
)
|
||||
|
||||
doAssert(obj == to(%obj, type(obj)))
|
||||
|
||||
when not defined(js):
|
||||
const fragments = """[1,2,3] {"hi":3} 12 [] """
|
||||
var res = ""
|
||||
for x in parseJsonFragments(newStringStream(fragments)):
|
||||
res.add($x)
|
||||
res.add " "
|
||||
doAssert res == fragments
|
||||
|
||||
Reference in New Issue
Block a user