Elm技术问询:如何将JSON对象列表解码为以ID为键的Dict String Foo
如何将JSON数组解码为Dict[String, Foo]类型
我来帮你搞定这个JSON解码的问题!核心逻辑很清晰:先把输入的JSON数组解析成Foo对象的列表,再利用每个Foo的id字段作为字典的键,把列表转换成你需要的Dict String Foo类型。下面我用几种主流语言给你具体的实现示例:
1. Scala 实现(用Circe JSON库)
Scala里常用Circe来处理JSON序列化/反序列化,先定义Foo的case class(对应你说的record类型),再生成解码器,最后转成Map(Scala里的Map就是Dict):
import io.circe._ import io.circe.generic.semiauto._ import io.circe.parser.decode // 定义Foo record类型,包含id和name两个字符串字段 case class Foo(id: String, name: String) // 自动为Foo生成JSON解码器 implicit val fooDecoder: Decoder[Foo] = deriveDecoder[Foo] // 你的输入JSON字符串 val jsonInput = """[{"id":"1", "name":"Jane"},{"id":"2", "name":"Joe"}]""" // 分步处理: // 1. 把JSON解码成Foo对象的列表 val fooListResult: Either[Error, List[Foo]] = decode[List[Foo]](jsonInput) // 2. 将列表转成以id为键的Map val fooDictResult: Either[Error, Map[String, Foo]] = fooListResult.map { list => list.map(foo => foo.id -> foo).toMap } // 处理结果(成功/失败分支) fooDictResult match { case Right(dict) => println(dict) // 输出: Map(1 -> Foo(1,Jane), 2 -> Foo(2,Joe)) case Left(err) => println(s"解码出错啦: $err") }
2. Python 实现
Python用dataclass定义record类型,结合标准库的json模块就能轻松搞定:
import json from dataclasses import dataclass # 定义Foo record类型 @dataclass class Foo: id: str name: str # 输入的JSON字符串 json_input = '[{"id":"1", "name":"Jane"},{"id":"2", "name":"Joe"}]' # 解析并转换: # 1. 把JSON转成Python字典列表 json_list = json.loads(json_input) # 2. 用字典推导式生成以id为键的Foo字典 foo_dict = {item["id"]: Foo(id=item["id"], name=item["name"]) for item in json_list} print(foo_dict) # 输出: {'1': Foo(id='1', name='Jane'), '2': Foo(id='2', name='Joe')}
3. TypeScript 实现
TypeScript里用接口定义Foo类型,然后通过reduce方法把数组转成字典:
// 定义Foo类型(对应record) interface Foo { id: string; name: string; } // 输入的JSON字符串 const jsonInput = '[{"id":"1", "name":"Jane"},{"id":"2", "name":"Joe"}]'; // 解析并转换: // 1. 把JSON解析成Foo数组 const fooList: Foo[] = JSON.parse(jsonInput); // 2. 用reduce转成以id为键的字典(Record<string, Foo>就是TypeScript里的Dict类型) const fooDict: Record<string, Foo> = fooList.reduce((acc, foo) => { acc[foo.id] = foo; return acc; }, {} as Record<string, Foo>); console.log(fooDict); // 输出: { '1': { id: '1', name: 'Jane' }, '2': { id: '2', name: 'Joe' } }
内容的提问来源于stack exchange,提问作者stoft
相关产品推荐
相关产品推荐

