使用Python转换第一级JSON密钥-已解决

使用Python转换第一级JSON密钥-已解决,python,json,python-3.x,Python,Json,Python 3.x,我有以下JSON: { "1605855600000": [ { “id”:“1”, “值”:“1.选择1”, “已检查”:真 }, { “id”:“2”, “价值”:“2.选择2”, “选中”:false }, { “id”:“3”, “价值”:“3.选择3”, “选中”:false }, { “id”:“4”, “价值”:“4.选择4”, “选中”:false }, { “id”:“5”, “价值”:“5.选择5”, “选中”:false } ], "1604732400000": [ {

我有以下JSON:

{
"1605855600000":
[
{
“id”:“1”,
“值”:“1.选择1”,
“已检查”:真
},
{
“id”:“2”,
“价值”:“2.选择2”,
“选中”:false
},
{
“id”:“3”,
“价值”:“3.选择3”,
“选中”:false
},
{
“id”:“4”,
“价值”:“4.选择4”,
“选中”:false
},
{
“id”:“5”,
“价值”:“5.选择5”,
“选中”:false
}
],
"1604732400000":
[
{
“id”:“1”,
“值”:“1.选择1”,
“选中”:false
},
{
“id”:“2”,
“价值”:“2.选择2”,
“选中”:false
},
{
“id”:“3”,
“价值”:“3.选择3”,
“选中”:false
},
{
“id”:“4”,
“价值”:“4.选择4”,
“选中”:false
},
{
“id”:“5”,
“价值”:“5.选择5”,
“选中”:false
}
]
}
我不确定确切的术语,但“键”如“1605855600000”和“160473240000”是我需要在Python中转换的UNIX时间戳

以下是我到目前为止的情况:

def convert_时间戳(obj):
对于obj.keys()中的键:
时间戳=整数(键)/1000
dt_object=datetime.fromtimestamp(时间戳)
日期=dt_对象.strftime(“%B%d,%Y”)
新密钥=日期
如果是新的_键!=关键:
obj[new_key]=obj[key]
del obj[键]
返回obj
data=json.loads(数据、对象\u hook=convert\u时间戳)
但是,我收到的错误是:
ValueError:以10为基数的int()的文本无效:“id”
这意味着它正在接近一个低于我试图改变的水平

我知道定义中的逻辑可以输出我需要的字符串作为最终结果,但是用当前逻辑访问和替换这些字符串是行不通的

最终输出需要如下所示:

{
“2020年11月12日”:
[
{
“id”:“1”,
“值”:“1.选择1”,
“已检查”:真
},
...
下面是我最终如何解决它的

json\u data=json.load(数据)
dict_keys=json_data.keys()
时间戳=[]
对于x in dict_键:
日期=整数(x)/1000
dt_object=datetime.fromtimestamp(date_val)
日期=dt_对象.strftime(“%B%d,%Y”)
timestamp.append(日期)
final_dict=dict(zip(时间戳,列表(json_data.values()))
从本质上讲,将键拉入列表、执行转换,然后将该列表作为新键合并回值,而不是试图一下子完成。对于有严格性能要求的人来说,这可能并不理想,但对于本用例来说,它会起作用。

您的意思是:

data=json.load(数据)
数据=转换时间戳(数据)

您在
json.loads
中误用了
object\u hook
参数

从文件中

object_hook是一个可选函数,将使用 任何对象文字解码的结果(dict)。的返回值 将使用对象挂钩而不是dict。可以使用此功能 实现自定义解码器(例如JSON-RPC类暗示)

因此,它采用键找到的第一个对象。正如@quamrana在其回答中提到的,您需要执行以下操作:

json_data = json.loads(data)
converted_data = convert_timestamp(json_data)

此外,不重写数据而是使用单独的变量被认为是一种良好的做法。

制作一个新的
dict
比乱动键要好得多:

导入json
从日期时间导入日期时间
数据_str=''{
"1605855600000":
[
{“id”:“1”,“value”:“1.Choice 1”,“checked”:true},
{“id”:“2”,“value”:“2.选择2”,“checked”:false},
{“id”:“3”,“value”:“3.选择3”,“checked”:false},
{“id”:“4”,“value”:“4.选择4”,“选中”:false},
{“id”:“5”,“value”:“5.选择5”,“选中”:false}
],
"1604732400000":
[
{“id”:“1”,“value”:“1.选择1”,“checked”:false},
{“id”:“2”,“value”:“2.选择2”,“checked”:false},
{“id”:“3”,“value”:“3.选择3”,“checked”:false},
{“id”:“4”,“value”:“4.选择4”,“选中”:false},
{“id”:“5”,“value”:“5.选择5”,“选中”:false}
]
}'''
def convert_时间戳(键):
时间戳=整数(键)/1000
dt_object=datetime.fromtimestamp(时间戳)
返回dt_object.strftime(“%B%d,%Y”)
def转换_键(obj):
返回{convert_timestamp(key):obj.items()中(key,val)的val}
data=json.loads(data_str)
新建\u数据=转换\u键(数据)
打印(新数据)
输出:

{'November 20, 2020': [{'id': '1', 'value': '1. Choice 1', 'checked': True}, {'id': '2', 'value': '2. Choice 2', 'checked': False}, {'id': '3', 'value': '3. Choice 3', 'checked': False}, {'id': '4', 'value': '4. Choice 4', 'checked': False}, {'id': '5', 'value': '5. Choice 5', 'checked': False}], 'November 07, 2020': [{'id': '1', 'value': '1. Choice 1', 'checked': False}, {'id': '2', 'value': '2. Choice 2', 'checked': False}, {'id': '3', 'value': '3. Choice 3', 'checked': False}, {'id': '4', 'value': '4. Choice 4', 'checked': False}, {'id': '5', 'value': '5. Choice 5', 'checked': False}]}

我建议您阅读。感谢您的澄清。但是,它仍然只返回要转换的第一个值,好像循环中出现了问题,没有访问所有键值。即使每次我转换为该键值,它也只返回转换后的第一个键值,而不返回第二个键值。我已尝试更改
返回的结构
在for循环中,但没有运气。