首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用NeoJSON解析法老中的ndjson

如何用NeoJSON解析法老中的ndjson
EN

Stack Overflow用户
提问于 2016-01-20 15:41:41
回答 3查看 620关注 0票数 1

我想在法老Smalltalk上用尼德逊 (换行符分隔的json)来解析NeoJSON数据。

ndjson数据如下所示:

代码语言:javascript
运行
复制
{"smalltalk": "cool"}
{"pharo": "cooler"}

目前,我将文件流转换为字符串,将其拆分到换行符上,然后使用NeoJSON解析单个部分。这似乎使用了不必要的(而且非常庞大)的内存和时间,可能是因为将流转换为字符串,反之亦然。怎样才能有效地完成这项任务?

如果您查找示例数据:1.ndjson

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-21 12:52:24

这是斯文(NeoJSON的作者)在法老用户邮件列表上的回答(他不在SO上):

读取“格式”很容易,只需继续对每个JSON表达式执行#next (忽略空格)。

代码语言:javascript
运行
复制
| data reader |
data := '{"smalltalk": "cool"}
{"pharo": "cooler"}'.
reader := NeoJSONReader on: data readStream.
Array streamContents: [ :out |
  [ reader atEnd ] whileFalse: [ out nextPut: reader next ] ].

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

代码语言:javascript
运行
复制
| 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.

它花了几秒钟,它是80MB+通过网络上的50K项目毕竟。

票数 3
EN

Stack Overflow用户

发布于 2016-01-21 11:18:24

如果您打开一个新的ReadWriteStream,首先将${写到它上,然后将原始流的所有内容用逗号分隔到它上,然后写一个尾随的$},它会工作吗?生成的流应该对NeoJSON有好处.?这可能是对问题的STTCPW攻击,但是W是重要的;-)而且它应该更快,更少的内存消耗,因为NeoJSON只需执行一次。

只是个主意,还没试过。

票数 2
EN

Stack Overflow用户

发布于 2016-01-21 12:50:09

你可以试试这样的方法:

代码语言:javascript
运行
复制
| 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.

除非这是你已经尝试过的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34904337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档