You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 03:54:59