当前位置: 首页 > 面试题库 >

从文本文件中检索JSON对象(使用Python)

凌宏大
2023-03-14
问题内容

我有成千上万个包含多个JSON对象的文本文件,但是不幸的是,这些对象之间没有分隔符。对象存储为字典,它们的某些字段本身就是对象。每个对象可能具有可变数量的嵌套对象。具体来说,一个对象可能看起来像这样:

{field1: {}, field2: "some value", field3: {}, ...}

并在文本文件中串联了数百个这样的对象而没有分隔符。这意味着我既不能使用json.load()也不可以json.loads()

关于如何解决此问题的任何建议。是否有已知的解析器可以执行此操作?


问题答案:

这将从字符串中解码您的JSON对象“列表”:

from json import JSONDecoder

def loads_invalid_obj_list(s):
    decoder = JSONDecoder()
    s_len = len(s)

    objs = []
    end = 0
    while end != s_len:
        obj, end = decoder.raw_decode(s, idx=end)
        objs.append(obj)

    return objs

这里的好处是您可以与解析器一起很好地玩。因此,它会不断告诉您 确切 的错误位置。

例子

>>> loads_invalid_obj_list('{}{}')
[{}, {}]

>>> loads_invalid_obj_list('{}{\n}{')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "decode.py", line 9, in loads_invalid_obj_list
    obj, end = decoder.raw_decode(s, idx=end)
  File     "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 376, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting object: line 2 column 2 (char 5)

清洁溶液(稍后添加)

import json
import re

#shameless copy paste from json/decoder.py
FLAGS = re.VERBOSE | re.MULTILINE | re.DOTALL
WHITESPACE = re.compile(r'[ \t\n\r]*', FLAGS)

class ConcatJSONDecoder(json.JSONDecoder):
    def decode(self, s, _w=WHITESPACE.match):
        s_len = len(s)

        objs = []
        end = 0
        while end != s_len:
            obj, end = self.raw_decode(s, idx=_w(s, end).end())
            end = _w(s, end).end()
            objs.append(obj)
        return objs

例子

>>> print json.loads('{}', cls=ConcatJSONDecoder)
[{}]

>>> print json.load(open('file'), cls=ConcatJSONDecoder)
[{}]

>>> print json.loads('{}{} {', cls=ConcatJSONDecoder)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 339, in loads
    return cls(encoding=encoding, **kw).decode(s)
  File "decode.py", line 15, in decode
    obj, end = self.raw_decode(s, idx=_w(s, end).end())
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 376, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting object: line 1 column 5 (char 5)


 类似资料:
  • 问题内容: 我正在尝试使用Jquery从本地文件中获取JSON对象(产品)的列表,并将所有对象存储在称为allItems的单个数组中。该文件与代码位于同一目录中,称为“ allItems.json”。这是我现在的做法: 基于此示例:http : //api.jquery.com/jQuery.getJSON/ 问题答案: 为了能够返回任何项目,AJAX调用需要同步运行。 转换为以下异步调用: 异步

  • 今天发生了一件奇怪的事情:我正试图使用jquery和ajax从一个JSON文件中检索一些数据,并将这些数据显示在一个网页上。我在互联网上找到的这个例子对我在基础操作系统上起作用。当我尝试从带有Win10操作系统的虚拟机运行它时,它不起作用,这意味着它会将我抛到:。为什么?提前多谢! 这在我的data19.json文件中: 我的脚本script19.js是: 我的HTML文件是:

  • 问题内容: 我有要解析的JSON文件。JSON文件(“ myfile”)的格式如下: 我想从语言级别检索键2的值(ŚrednioZaawansowany)。 接下来做什么?我如何迭代呢? 问题答案: 也许您没有使用Java库的最新版本的JSON。 已有很长时间没有更新,而2个月前已更新。 可以在GitHub上找到,这是其仓库的链接:https : //github.com/douglascrock

  • 问题内容: 我在javascript中有一个JSON对象。我只想将JSON对象写入文本文件。到目前为止,从我遇到的情况来看,由于客户端的安全问题,无法这样做。有解决方法吗?如果最初放置一些虚拟值,是否可以修改已经存在的文件? 谢谢 问题答案: 您可以做的一件事就是将JSON设置为即时下载。 工作演示:http : //jsfiddle.net/sLq3F/ 除此之外,由于安全原因,您无法在客户端的

  • 试图从我的php api中获取一个值,在android上,使用截取。。。我的api运行良好,返回了我想要的值,但在我的android上,我似乎可以将值保存在一个变量上。 这是我的php脚本 在我的android studio上,我尝试像这样获取值,我发送3个值插入到数据库中,然后我想将我插入的行的id返回到android。我看过很多关于stackoverflow的答案,但我似乎无法理解和解决我的问

  • 问题内容: 我正在使用JSON传输数据。 我需要在HTML页面中使用Ajax读取仅在脚本中包含一个JSON对象的文件吗? 我是否也需要jQuery,或者是否可以使用Ajax加载该JSON文件? 在不同的浏览器上是否有所不同? 问题答案: 您不需要任何库,香草javascript中的所有内容均可用,以获取json文件并进行解析: