2016-12-05 117 views
-1

尊重, 我trig是使用与base64编码的json文件的内容。 我想解码json文件的编码部分。以下是我的代码。提取JSON文件在base64解码

response={"response": [{"objcontent": [{"rowkeys":["time","lat","lon","tos"],"rowvalues": [["AAAAAAAALkA=","AAAAAADgU8A=","AAAAAAAA8D8=","7HitYA"],["AAAAAAAALkA=","AAAAAADgU8A=","AAAAAAAACEA=","7HitYA"],["AAAAAAAALkA=","AAAAAADgU8A=","AAAAAAAAFEA=","7HitYA"]]}]}]} 

import base64 
import struct 
for response_i in response['response']: 
    a=base64.b64decode(response_i['objcontent'][0]['rowvalues']) 
    struct.unpack('12d',a) 

以下是我得到的错误。

TypeError: argument should be a bytes-like object or ASCII string, not 'list' 

可能有人提供一些技巧来解决这个问题。 谢谢。

+1

重新读取错误信息。 –

+0

你有**列表**的字符串,而不是一个字符串。 –

回答

1

你传递你的整个列表,它本身包含多个列表:

>>> response_i['objcontent'][0]['rowvalues'] 
[['AAAAAAAALkA=', 'AAAAAADgU8A=', 'AAAAAAAA8D8=', '7HitYA'], ['AAAAAAAALkA=', 'AAAAAADgU8A=', 'AAAAAAAACEA=', '7HitYA'], ['AAAAAAAALkA=', 'AAAAAADgU8A=', 'AAAAAAAAFEA=', '7HitYA']] 

你需要解码每个单独的条目,而不是整个列表:

for response_i in response['response']: 
    for row in response_i['objcontent'][0]['rowvalues']: 
     for encoded_obj in row[:-1]: 
      decoded = base64.b64decode(encoded_obj) 

注意,我忽略的该行中的最后一个值,这不是Base64值。

你的未来问题是你的Base64数据没有足够的字节来保存12个浮点值(每个8字节,所以你需要96字节)。由于它们分别是8字节,所以每个字符串中可能只有一个一个浮点值。

所以,你会想只是一个浮动解码:

floating_point_value = struct.unpack('d', decoded)[0] 

演示:

>>> for response_i in response['response']: 
...  for row in response_i['objcontent'][0]['rowvalues']: 
...   for encoded_obj in row[:-1]: 
...    decoded = base64.b64decode(encoded_obj) 
...    print(struct.unpack('d', decoded)[0]) 
... 
15.0 
-79.5 
1.0 
15.0 
-79.5 
3.0 
15.0 
-79.5 
5.0 
0

你的json似乎是畸形的,还有更多的开放[比关闭]。所以我不能给你一个确切的分解。

无论如何,与键'rowvalues'匹配的值是列表[[],[],[]]的列表。所以,你需要相应地打破它以正确的价值观传递给解码器

for value_list in response_i['objcontent'][0]['rowvalues']: 
    for value in value_list: 
     # enter your decode code here 
0

这确实以base64解码,将struct.unpack我失败。

import base64 
import struct 

response = { 
    "response": [{ 
     "objcontent": [{ 
      "rowkeys": ["time", "lat", "lon", "tos"], 
      "rowvalues": [ 
       ["AAAAAAAALkA=", "AAAAAADgU8A=", "AAAAAAAA8D8=", "7HitYA"], 
       ["AAAAAAAALkA=", "AAAAAADgU8A=", "AAAAAAAACEA=", "7HitYA"], 
       ["AAAAAAAALkA=", "AAAAAADgU8A=", "AAAAAAAAFEA=", "7HitYA"] 
      ] 
     }] 
    }] 
} 


for response_i in response['response']: 
    for r in response_i['objcontent'][0]['rowvalues']: 
     for item in r[:-1]: # last item doesnt seem to be be base64 encoded ! 
      a = base64.b64decode(item) 
      print a 
      # .... whatever ... struct.unpack('12d',a)