从现有 JSON 中复制一些 k,v 以在 Python 中构成另一个 JSON
Copy some k,v from existing JSON to constitute another JSON in Python
我有这个 JSON :
{
"duration": 1942,
"frame_id": 0,
"detect1": [
{
"type": {
"s_type1": [
{
"confidence": 98.70016,
"klass": -1,
"name": "c*****"
},
{
"confidence": 1.042385,
"klass": -1,
"name": "c*****"
},
{
"confidence": 0.1587732,
"klass": -1,
"name": "s*****"
}
],
"s_type2": [
{
"confidence": 92.82484,
"klass": -1,
"name": "b*****"
},
{
"confidence": 7.098834,
"klass": -1,
"name": "b*****"
},
{
"confidence": 0.02423214,
"klass": -1,
"name": "p*****"
},
],
"Box": [
80.80994,
170.0965,
1091.778
]
},
"confidences": [
90.08681,
99.91595,
90.12489
]
}
]
}
我想将此 JSON 中的一些键和值保存到另一个 JSON。新的 JSON 将保留 :
duration
(k,v),
frame_id
(k,v),
detect1
:
type
: s_type1
和 s_type2
只有第一个字典会被保留并且 klass
(k,v) 会被删除,
Box
(k,v)
confidences
(k,v)
最终结果:
{
"duration": 1942,
"frame_id": 0,
"detect1": [
{
"type": {
"s_type1": [
{
"confidence": 98.70016,
"name": "c*****"
},
],
"s_type2": [
{
"confidence": 92.82484,
"name": "b*****"
}
],
"Box": [
80.80994,
170.0965,
1091.778
]
},
"confidences": [
90.08681,
99.91595,
90.12489
]
}
]
}
我试图用 JMESPath 库来做,但我得不到好的结果。
有人知道这样做吗?
谢谢
使用 jmespath
得到你想要的输出:
import jmespath
expression = """{duration: duration,
frame_id: frame_id,
detect1: [{type:{s_type1: [detect1[].type.s_type1[].merge({confidence: confidence, name: name})|[0]],
s_type2: [detect1[].type.s_type2[].merge({confidence: confidence, name: name})|[0]],
Box: detect1[].type.Box[]},
confidences: detect1[].confidences[]
}
]}
"""
expression = jmespath.compile(expression)
expression.search(json)
{'duration': 1942,
'frame_id': 0,
'detect1': [{'type': {'s_type1': [{'confidence': 98.70016, 'name': 'c*****'}],
's_type2': [{'confidence': 92.82484, 'name': 'b*****'}],
'Box': [80.80994, 170.0965, 1091.778]},
'confidences': [90.08681, 99.91595, 90.12489]}]}
我有这个 JSON :
{
"duration": 1942,
"frame_id": 0,
"detect1": [
{
"type": {
"s_type1": [
{
"confidence": 98.70016,
"klass": -1,
"name": "c*****"
},
{
"confidence": 1.042385,
"klass": -1,
"name": "c*****"
},
{
"confidence": 0.1587732,
"klass": -1,
"name": "s*****"
}
],
"s_type2": [
{
"confidence": 92.82484,
"klass": -1,
"name": "b*****"
},
{
"confidence": 7.098834,
"klass": -1,
"name": "b*****"
},
{
"confidence": 0.02423214,
"klass": -1,
"name": "p*****"
},
],
"Box": [
80.80994,
170.0965,
1091.778
]
},
"confidences": [
90.08681,
99.91595,
90.12489
]
}
]
}
我想将此 JSON 中的一些键和值保存到另一个 JSON。新的 JSON 将保留 :
duration
(k,v),frame_id
(k,v),detect1
:type
:s_type1
和s_type2
只有第一个字典会被保留并且klass
(k,v) 会被删除,Box
(k,v)
confidences
(k,v)
最终结果:
{
"duration": 1942,
"frame_id": 0,
"detect1": [
{
"type": {
"s_type1": [
{
"confidence": 98.70016,
"name": "c*****"
},
],
"s_type2": [
{
"confidence": 92.82484,
"name": "b*****"
}
],
"Box": [
80.80994,
170.0965,
1091.778
]
},
"confidences": [
90.08681,
99.91595,
90.12489
]
}
]
}
我试图用 JMESPath 库来做,但我得不到好的结果。
有人知道这样做吗?
谢谢
使用 jmespath
得到你想要的输出:
import jmespath
expression = """{duration: duration,
frame_id: frame_id,
detect1: [{type:{s_type1: [detect1[].type.s_type1[].merge({confidence: confidence, name: name})|[0]],
s_type2: [detect1[].type.s_type2[].merge({confidence: confidence, name: name})|[0]],
Box: detect1[].type.Box[]},
confidences: detect1[].confidences[]
}
]}
"""
expression = jmespath.compile(expression)
expression.search(json)
{'duration': 1942,
'frame_id': 0,
'detect1': [{'type': {'s_type1': [{'confidence': 98.70016, 'name': 'c*****'}],
's_type2': [{'confidence': 92.82484, 'name': 'b*****'}],
'Box': [80.80994, 170.0965, 1091.778]},
'confidences': [90.08681, 99.91595, 90.12489]}]}