【问题标题】:Commas between two json object两个 json 对象之间的逗号
【发布时间】:2019-05-10 13:17:41
【问题描述】:

我正在从伪 xml 格式文件创建一个 json 文件。但是我在 json 对象之间得到逗号,这是我不想要的。

这是我得到的示例:

[{"a": a , "b": b } , {"a": a , "b": b }]

但是我想要这个:

{"a": a , "b": b } {"a": a , "b": b }

它可能不是一个有效的 json,但我希望它是这样的,以便我可以通过这样做来随机播放它:

shuf -n 100000 original.json > sample.json

否则就是一大行json

这是我的代码:

def read_html_file(file_name):
    f = open(file_name,"r", encoding="ISO-8859-1")
    html = f.read()
    parsed_html = BeautifulSoup(html, "html.parser")
    return parsed_html

def process_reviews(parsed_html):
    reviews = []
    for r in parsed_html.findAll('review'):
        review_text = r.find('review_text').text
        asin = r.find('asin').text
        rating = r.find('rating').text
        product_type = r.find('product_type').text
        reviewer_location = r.find('reviewer_location').text
        reviews.append({
            'review_text': review_text.strip(),
            'asin': asin.strip(),
            'rating': rating.strip(),
            'product_type': product_type.strip(),
            'reviewer_location': reviewer_location.strip()
        })

    return reviews

def write_json_file(file_name, reviews):
    with open('{f}.json'.format(f=file_name), 'w') as outfile:
        json.dump(reviews, outfile)

if __name__ == '__main__':
    parser = optparse.OptionParser()
    parser.add_option('-f', '--file_name',action="store", dest="file_name",
    help="name of the input html file to parse", default="positive.html")
    options, args = parser.parse_args()
    file_name = options.file_name

    html = read_html_file(file_name)
    reviews_list = process_reviews(html)
    write_json_file(file_name,reviews_list)

第一个 [ ] 是因为 reviews = [],我可以手动删除它,但我也不想在我的 json 对象之间使用逗号。

【问题讨论】:

  • 如果没有逗号就不是json
  • 你不能那样做。你想要这个纯粹是为了展示吗?如果您以这种格式保存文件,它基本上会损坏。
  • 除了@vidstige所说的,如果你想让它成为有效的json,不要删除[和]
  • 我已经编辑了这个问题来解释我为什么要这样

标签: python json beautifulsoup


【解决方案1】:

您在问题中混入了一些概念!
1。你所拥有的不是dict,而是dictslist
2。您的输入元素 list 和预期的输出都没有 JSON 格式

现在寻求解决方案,如果您只想 print 您的对象而不用 comma 分隔它们,那么您只需要 print 您的所有元素列表,您可以做什么:

sample = [{"a": "a" , "b": "b" } , {"a": "a" , "b": "b" }]
print(" ".join([str(element) for element in sample]))

现在,如果您真正想要将其作为 JSON 对象进行操作,您有两个选择,使用 json 库:

sample 中的每个元素作为 Json 添加并单独操作

它们已被格式化为 Json,因此您可以使用 json 库对它们进行操作,以将 (dumps) 打印为字符串或任何其他操作:

import json    
for element in sample:
        print(json.dumps(element, indent = 4))

让你的示例列表变成一个 Json

您可以将所有元素添加到单个 key,假设添加到名为 elementskey,会是什么:

sample_json = {"elements": []}
for data in sample:
    sample_json["elements"].append(data)
# Output from sample_json
# {'elements': [{'a': 'a', 'b': 'b'}, {'a': 'a', 'b': 'b'}]}

或者您可以将每个元素添加到不同的key。例如,我将创建一个计数器,计数器的每个数字将为特定的element 定义一个不同的key

sample_json = {}
counter = 0
for data in sample:
    sample_json[counter] = data
    counter += 1
# Output from sample_json
# {0: {'a': 'a', 'b': 'b'}, 1: {'a': 'a', 'b': 'b'}}

对于第二种情况,您也可以使用文本 keys

【讨论】:

    【解决方案2】:

    您要求的不是 JSONThe standards,根据定义,指定对象之间必须有逗号。您有两种选择:

    1. 更新您的解析器以符合标准(强烈推荐)。
    2. 出于显示目的或您可能拥有的其他内部处理,如果您真的想要您指定的结构:捕获 JSON 对象并将其转换为其他内容,但请不要将其称为 JSON,因为它不是。

    【讨论】:

    • 我已经编辑了这个问题来解释我为什么要这样
    • 然后您需要捕获 JSON,然后将其解析为对您的目的有用的东西。选项 2。
    • @BlueMango 您需要捕获 JSON 对象并执行一些自定义文本转换。这在我的回答和我上面的评论中都有解释。如果您认为这回答了问题,请将其标记为正确。如果您需要文本解析器的帮助,我认为这是一个不同的问题,您应该再次发布
    猜你喜欢
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    相关资源
    最近更新 更多