如何使用NeoJSON解析Pharo中的ndjson

如何使用NeoJSON解析Pharo中的ndjson,json,stream,smalltalk,pharo,ndjson,Json,Stream,Smalltalk,Pharo,Ndjson,我想用Pharo Smalltalk解析(以换行符分隔的json)数据 ndjson数据如下所示: {"smalltalk": "cool"} {"pharo": "cooler"} | input reader | input := FileStream readOnlyFileNamed: 'resources/pd_items_1.ndjson.txt'. [ Array streamContents: [ :strm | | ln | [ (

我想用Pharo Smalltalk解析(以换行符分隔的json)数据

ndjson数据如下所示:

{"smalltalk": "cool"}
{"pharo": "cooler"}
| input reader |
input := FileStream readOnlyFileNamed: 'resources/pd_items_1.ndjson.txt'.
[ 
Array
    streamContents: [ :strm | 
        | ln |
        [ (ln := input nextLine) isNil ] 
          whileFalse: [ strm nextPut: (NeoJSONReader fromString: ln) ] ] ] timeToRun.
此时,我将文件流转换为字符串,在换行符上拆分,然后使用NeoJSON解析单个部分。这似乎使用了不必要的(而且非常巨大的)内存和时间,可能是因为一直将流转换为字符串,反之亦然。完成这项任务的有效方法是什么


如果您查找示例数据:

如果您打开一个新的ReadWriteStream,首先将${写入其中,然后将原始流中的所有内容以逗号分隔,然后再写入尾随的$},是否可以工作。结果流应该适合NeoJSON? 这可能是对问题的STTCPW攻击,但W很重要;-)而且它应该更快,占用内存更少,因为NeoJSON只需完成一次


只是一个想法,还没有尝试过。

如果您打开一个新的ReadWriteStream,首先将${写入其中,然后将原始流中的所有内容以逗号分隔,然后在其上写入一个尾随的$},它会起作用吗。结果流应该适合NeoJSON? 这可能是对问题的STTCPW攻击,但W很重要;-)而且它应该更快,占用内存更少,因为NeoJSON只需完成一次


只是一个想法,还没有尝试过。

您可以尝试以下方法:

{"smalltalk": "cool"}
{"pharo": "cooler"}
| input reader |
input := FileStream readOnlyFileNamed: 'resources/pd_items_1.ndjson.txt'.
[ 
Array
    streamContents: [ :strm | 
        | ln |
        [ (ln := input nextLine) isNil ] 
          whileFalse: [ strm nextPut: (NeoJSONReader fromString: ln) ] ] ] timeToRun.

除非这是您已经尝试过的…

您可以尝试以下内容:

{"smalltalk": "cool"}
{"pharo": "cooler"}
| input reader |
input := FileStream readOnlyFileNamed: 'resources/pd_items_1.ndjson.txt'.
[ 
Array
    streamContents: [ :strm | 
        | ln |
        [ (ln := input nextLine) isNil ] 
          whileFalse: [ strm nextPut: (NeoJSONReader fromString: ln) ] ] ] timeToRun.
除非这是您已经尝试过的…

这是pharo用户邮件列表中Sven(NeoJSON的作者)的答案(他不在名单上):

读取“格式”很容易,只需继续为每个JSON表达式执行下一步(忽略空格)

防止中间数据结构也很容易,使用流式传输

| client reader data networkStream |
(client := ZnClient new)
  streaming: true;
  url: 'https://github.com/NYPL-publicdomain/data-and-utilities/blob/master/items/pd_items_1.ndjson?raw=true';
  get.
networkStream := ZnCharacterReadStream on: client contents.
reader := NeoJSONReader on: networkStream.
data := Array streamContents: [ :out |
  [ reader atEnd ] whileFalse: [ out nextPut: reader next ] ].
client close.
data.
这花了几秒钟的时间,通过网络传输的50K个项目的容量达到了80MB以上。

这是pharo用户邮件列表中Sven(NeoJSON的作者)的回答(他不在名单上):

读取“格式”很容易,只需继续为每个JSON表达式执行下一步(忽略空格)

防止中间数据结构也很容易,使用流式传输

| client reader data networkStream |
(client := ZnClient new)
  streaming: true;
  url: 'https://github.com/NYPL-publicdomain/data-and-utilities/blob/master/items/pd_items_1.ndjson?raw=true';
  get.
networkStream := ZnCharacterReadStream on: client contents.
reader := NeoJSONReader on: networkStream.
data := Array streamContents: [ :out |
  [ reader atEnd ] whileFalse: [ out nextPut: reader next ] ].
client close.
data.

花了几秒钟的时间,网络上的50K个项目的容量毕竟是80MB以上。

我想,你是说用$[和$]来制作一个数组?这很好。我想,你是说用$[和$]来做一个数组?这很有效。