我正在尝试加载一个填充了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对象,因为我正在逐行读取文件?谢谢!
我有一个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.我仍然宁愿使用经过其他人测试和使用的东西,而不是自己编写代码,所以我将这个问题保持开放.
我正在编写一个Web服务,它返回包含很长列表的对象,这些列表以JSON编码.当然我们想要使用迭代器而不是Python列表,所以我们可以从数据库中流式传输对象; 遗憾的是,标准库(json.JSONEncoder)中的JSON编码器只接受要转换为JSON列表的列表和元组(虽然_iterencode_list看起来它实际上可以在任何迭代上工作).
文档字符串建议覆盖默认值以将对象转换为列表,但这意味着我们失去了流式传输的好处.以前,我们覆盖了一个私有方法,但是(正如预期的那样)在重构编码器时崩溃了.
以流方式将迭代器序列化为Python中的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)
{"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) 我必须将我的应用程序所做的事情记录到一个 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)
那不是我想要的,因为它不必要地填满了内存。我想循序渐进地做..一些建议?
我有一个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在二进制文件中保存这些对象的两个内容的最佳方法是什么?理想情况下,我想将两个对象保存在同一个二进制文件中,以后可以加载数据.