如何在Python中将字符串转换为JSON?
我有一个字符串,是我在使用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"}