如何在Python中将字符串转换为JSON?

2 投票
3 回答
1432 浏览
提问于 2025-04-18 11:16

我有一个字符串,是我在使用git时得到的,具体操作是这样的:

> git show xxxx | head -3

commit 34343asdfasdf343434asdfasdfas
Author: John Doe <john@doe.com>
Date:   Wed Jun 25 09:51:49 2014 +0800

我想把这个在控制台打印出来的字符串转换成json格式,用python来实现,所以我在脚本中写的格式是这样的:

{'commit': '34343asdfasd343adfas', 'Author': 'john doe', 'date': 'wed jun 25'} 

现在我正在尝试手动根据字符串中的第一个空格来分割它。

3 个回答

0

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。这就像给程序设定了一些规则,只有当这些规则被满足时,程序才会继续运行。

比如说,你可能想要让程序在用户输入一个特定的数字时才进行计算。如果用户输入的不是这个数字,程序就会停止或者给出提示。这种情况就需要用到条件判断。

条件判断就像是一个分岔路口,程序会根据你设定的条件选择不同的路径去执行。这样可以让程序更加灵活,能够处理不同的情况。

在代码中,通常会用一些简单的语句来实现这些条件,比如“如果……那么……”这样的结构。通过这种方式,程序就能根据不同的输入做出不同的反应。

总之,条件判断是让程序能够根据情况做出不同反应的重要工具,掌握它能让你的编程更加得心应手。

import subprocess
results = subproccess.Popen("git show xxxx | head -3",stdout=subprocess.PIPE,shell=True).communicate()[0].strip()
data = {}
for line in results.splitlines():
     key,value = line.split(" ",1)
     data[re.sub("[^a-zA-Z]","",key)] = value
json.dumps(data)
0

尝试遵循值的确切格式

提问者想要一些稍微定制的值,这些值并不是简单去掉标签词后的确切值。为了实现这个目标,我们需要逐行处理。

首先,把输入的文本分成多行:

>>> text = """commit 34343asdfasdf343434asdfasdfas
... Author: John Doe <john@doe.com>
... Date:   Wed Jun 25 09:51:49 2014 +0800"""
...
>>> lines = text.split("\n")
>>> lines
['commit 34343asdfasdf343434asdfasdfas',
 'Author: John Doe <john@doe.com>',
 'Date:   Wed Jun 25 09:51:49 2014 +0800']

假设行的顺序是固定的,然后逐部分进行处理:

>>> dct = {}
>>> dct["commit"] = lines[0].split()[1]
>>> dct["Author"] = lines[1].split(": ")[1].split(" <")[0]
>>> dct["Date"] = " ".join(lines[2].split(": ")[1].split()[:3])

创建最终的字典:

>>> dct
{'Author': 'John Doe',
 'Date': 'Wed Jun 25',
 'commit': '34343asdfasdf343434asdfasdfas'}

这个字典可以转换成字符串:

>>> import json
>>> json.dumps(dct)
'{"Date": "Wed Jun 25", "commit": "34343asdfasdf343434asdfasdfas", "Author": "John Doe"}'
3

这个在你的例子中是有效的:

>>> txt='''\
... commit 34343asdfasdf343434asdfasdfas
... Author: John Doe <john@doe.com>
... Date:   Wed Jun 25 09:51:49 2014 +0800'''
>>> json.dumps({k:v for k,v in re.findall(r'^([^\s]+)\s+(.+?)$', txt, re.M)})
{"commit": "34343asdfasdf343434asdfasdfas", "Date:": "Wed Jun 25 09:51:49 2014 +0800", "Author:": "John Doe <john@doe.com>"}

如果你有 git... 这一部分,只需要把它分开:

>>> json.dumps({k:v for k,v in re.findall(r'^([^\s]+)\s+(.+?)$', 
                           txt.partition('\n\n')[2], re.M)})

如果你想去掉 :,只需修改正则表达式的捕获组来实现:

>>> json.dumps({k:v for k,v in re.findall(r'^(\w+):?\s+(.+?)$', 
                          txt.partition('\n\n')[2], re.M)})
{"Date": "Wed Jun 25 09:51:49 2014 +0800", "commit": "34343asdfasdf343434asdfasdfas", "Author": "John Doe <john@doe.com>"}

如果你想去掉电子邮件地址:

>>> json.dumps({k:v for k,v in re.findall(r'^(\w+):?\s+(.+?)(?:\s*<[^>]*>)?$', 
                     txt.partition('\n\n')[2], re.M)})
{"Date": "Wed Jun 25 09:51:49 2014 +0800", 
 "commit": "34343asdfasdf343434asdfasdfas", "Author": "John Doe"}

撰写回答