相关疑难解决方法(0)

如何从大文件中读取行分隔的JSON(逐行)

我正在尝试加载一个填充了JSON字符串的大文件(大小为2GB),由换行符分隔.例如:

{
    "key11": value11,
    "key12": value12,
}
{
    "key21": value21,
    "key22": value22,
}
…
Run Code Online (Sandbox Code Playgroud)

我现在导入它的方式是:

content = open(file_path, "r").read() 
j_content = json.loads("[" + content.replace("}\n{", "},\n{") + "]")
Run Code Online (Sandbox Code Playgroud)

这似乎是一个黑客(在每个JSON字符串之间添加逗号以及开始和结束方括号以使其成为正确的列表).

有没有更好的方法来指定JSON分隔符(换行符\n而不是逗号,)?

而且,Python似乎无法为从2GB数据构建的对象正确分配内存,有没有办法构建每个JSON对象,因为我正在逐行读取文件?谢谢!

python parsing json large-files

21
推荐指数
4
解决办法
4万
查看次数

如何在JS中解析流上的第一个JSON对象

我有一个JSON对象流,就像通过TCP或WebSockets上的JSON-RPC一样.没有长度前缀或分隔符,因为JSON是自我分隔的.所以,当我从流中读取时,我可能会得到这样的结果:

{"id":1,"result":{"answer":23},"error":null}
{"id":2,"result":{"answer":42},"error":null}
{"id":3,"result":{"answ
Run Code Online (Sandbox Code Playgroud)

我需要逐个解析每个JSON对象.我不能用JSON.parse做到这一点,因为它只会在最后为无关数据抛出语法错误.

当然,通过这个例子,我可以逐行进行,但我不能依赖看起来那样的空白; JSON-RPC可以像这样容易:

{
  "id": 1, 
  "result": {
    "answer": 23
  },
  "error":null
} 
Run Code Online (Sandbox Code Playgroud)

或这个:

{"id":1,"result":{"answer":23},"error":null}{"id":2,"result":{"answer":42},"error":null}
Run Code Online (Sandbox Code Playgroud)

对于其他语言的大多数解析器,显而易见的答案是这样的(使用Python作为示例):

buf = ''
decoder = json.JSONDecoder()
def onReadReady(sock):
  buf += sock.read()
  obj, index = decoder.raw_decode(buf)
  buf = buf[index:]
  if obj:
    dispatch(obj)
Run Code Online (Sandbox Code Playgroud)

但我在JS中找不到类似的东西.我查看了我能找到的每个JS解析器,它们都有效地等同于JSON.parse.

我尝试查看各种JSON-RPC框架,看看他们如何处理这个问题,而他们却没有.他们中的许多人都认为recv总是会返回一个send(这对于JSON-RPC通过HTTP工作正常,但不适用于TCP或WebSockets - 当然,它可能在本地测试中起作用).其他人实际上并没有处理JSON-RPC,因为他们在空白上添加了需求(其中一些甚至对JSON-RPC都不起作用).

我可以编写一个分隔括号和引号的分隔符检查(当然是处理转义和引用),或者只是从头开始编写JSON解析器(或者从另一种语言编写端口1,或者修改http://code.google.com/p/json-sans-eval /),但我不敢相信之前没有人这样做过.

编辑:我已经做了两个版本的自己,http://pastebin.com/fqjKYiLw基于JSON的SAN-EVAL和http://pastebin.com/8H4QT82b基于Crockford的参考递归下降解析器json_parse.js.我仍然宁愿使用经过其他人测试和使用的东西,而不是自己编写代码,所以我将这个问题保持开放.

javascript json

17
推荐指数
1
解决办法
3794
查看次数

JSON编码很长的迭代器

我正在编写一个Web服务,它返回包含很长列表的对象,这些列表以JSON编码.当然我们想要使用迭代器而不是Python列表,所以我们可以从数据库中流式传输对象; 遗憾的是,标准库(json.JSONEncoder)中的JSON编码器只接受要转换为JSON列表的列表和元组(虽然_iterencode_list看起来它实际上可以在任何迭代上工作).

文档字符串建议覆盖默认值以将对象转换为列表,但这意味着我们失去了流式传输的好处.以前,我们覆盖了一个私有方法,但是(正如预期的那样)在重构编码器时崩溃了.

以流方式将迭代器序列化为Python中的JSON列表的最佳方法是什么?

python json

12
推荐指数
1
解决办法
2296
查看次数

如何从 Rust 的文件/流中懒惰地读取多个 JSON 值?

我想从 Rust 中的文件/读取器读取多个 JSON 对象,一次一个。不幸的是serde_json::from_reader(...)只读取到文件结束;似乎没有任何方法可以使用它来读取单个对象或懒惰地迭代对象。

有没有办法做到这一点?使用serde_json将是理想的,但如果有不同的库,我愿意使用它。

目前我将每个对象放在单独的行上并单独解析它们,但我真的不想这样做。

示例使用

主文件

use serde_json;

fn main() -> Result<(), Box<dyn std::error::Error>> {
   let stdin = std::io::stdin();
   let stdin = stdin.lock();

   for item in serde_json::iter_from_reader(stdin) {
     println!("Got {:?}", item);
   }

   Ok(())
}
Run Code Online (Sandbox Code Playgroud)

.txt

{"foo": ["bar", "baz"]} 1 2 [] 4 5 6
Run Code Online (Sandbox Code Playgroud)

示例会话

{"foo": ["bar", "baz"]} 1 2 [] 4 5 6
Run Code Online (Sandbox Code Playgroud)

serialization json rust

6
推荐指数
1
解决办法
1070
查看次数

jsoncpp 增量写入

我必须将我的应用程序所做的事情记录到一个 json 文件中。预计应用程序会持续数周,所以我想增量地编写 json 文件。

目前我正在手动编写 json,但是有一些日志阅读器应用程序正在使用 Jsoncpp lib,也应该用 Jsoncpp lib 写日志。

但是在手册和一些例子中我没有发现任何类似的东西..它总是像:

Json::Value root;
// fill the json

ofstream mFile;
mFile.open(filename.c_str(), ios::trunc);
mFile << json_string;
mFile.close();
Run Code Online (Sandbox Code Playgroud)

那不是我想要的,因为它不必要地填满了内存。我想循序渐进地做..一些建议?

c++ jsoncpp

3
推荐指数
1
解决办法
2066
查看次数

Python - 在二进制文件中一起保存对象?

我有一个python包含许多对象类-有些是数据结构(lists,dicts等)和一些处理程序,其他类(也包含其他数据结构...).

pickle我想知道是否有一种方法可以serialize存储几个所需对象的数据并将它们(仅限于它们)保存在二进制文件中,而不是用来保存整个类及其内容?

例如,假设我有以下2个python对象:

myList = [1, 2, 3, 4, 5]
myDict = {'a' : 14, 'b' : 5, 'c' : 65}
Run Code Online (Sandbox Code Playgroud)

python二进制文件中保存这些对象的两个内容的最佳方法是什么?理想情况下,我想将两个对象保存在同一个二进制文件中,以后可以加载数据.

python

1
推荐指数
1
解决办法
479
查看次数

标签 统计

json ×4

python ×3

c++ ×1

javascript ×1

jsoncpp ×1

large-files ×1

parsing ×1

rust ×1

serialization ×1