如何使用asn1tools将JER格式JSON转UPER并解决编码错误?
问题:JER转UPER时asn1tools编码错误,期望tuple却得到列表
问题背景
编写Python脚本将JER编码的JSON文件转换为UPER格式,使用asn1tools未找到直接转换方法,运行脚本时出现编码错误。
ASN.1 Schema文件(schema.asn)
Schema DEFINITIONS ::= BEGIN User ::= SEQUENCE { firstName IA5String, lastName IA5String, id ID } ID ::= CHOICE { userName IA5String, userEmail IA5String } END
JSON文件(user.json)
{ "firstName": "John", "lastName": "Doe", "id": ["userName", "johndoe"] }
Python脚本(script.py)
import json import asn1tools schema = asn1tools.compile_files('schema.asn', codec='uper') with open('user.json') as jer: schema.encode('User', json.load(jer))
报错信息
Traceback (most recent call last): File "/home/bijesh/playground/asn1_decoder/temp/script.py", line 7, in <module> schema.encode('User', json.load(jer)) File "/home/bijesh/anaconda3/lib/python3.9/site-packages/asn1tools/compiler.py", line 137, in encode type_.check_types(data) File "/home/bijesh/anaconda3/lib/python3.9/site-packages/asn1tools/codecs/compiler.py", line 102, in check_types return self.type_checker.encode(data) File "/home/bijesh/anaconda3/lib/python3.9/site-packages/asn1tools/codecs/type_checker.py", line 311, in encode raise e File "/home/bijesh/anaconda3/lib/python3.9/site-packages/asn1tools/codecs/type_checker.py", line 307, in encode self._type.encode(data) File "/home/bijesh/anaconda3/lib/python3.9/site-packages/asn1tools/codecs/type_checker.py", line 142, in encode self.encode_members(data) File "/home/bijesh/anaconda3/lib/python3.9/site-packages/asn1tools/codecs/type_checker.py", line 154, in encode_members raise e File "/home/bijesh/anaconda3/lib/python3.9/site-packages/asn1tools/codecs/type_checker.py", line 150, in encode_members member.encode(data[name]) File "/home/bijesh/anaconda3/lib/python3.9/site-packages/asn1tools/codecs/type_checker.py", line 224, in encode raise EncodeError( asn1tools.codecs.EncodeError: User.id: Expected data of type tuple(str, object), but got ['userName', 'johndoe'].
错误核心:asn1tools处理ASN.1 CHOICE类型时,要求传入**元组(tuple)**而非列表(list),但JSON解析后得到的是列表类型的['userName', 'johndoe']。
解决方案
修改Python脚本,将JSON解析出的列表转为元组即可:
import json import asn1tools schema = asn1tools.compile_files('schema.asn', codec='uper') with open('user.json') as jer: data = json.load(jer) # 将id字段的列表转为元组 data['id'] = tuple(data['id']) # 执行编码,可选保存为二进制文件 uper_data = schema.encode('User', data) with open('user.uper', 'wb') as f: f.write(uper_data)
说明
- asn1tools对CHOICE类型的编码要求是
(choice_name, value)形式的元组,这是因为元组作为不可变类型,更适合作为结构化数据标识。 - 若JSON中有多个CHOICE类型字段,可遍历数据批量转换,或针对性处理对应字段。
内容的提问来源于stack exchange,提问作者Bijesh Mohan
相关产品推荐
相关产品推荐

