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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:56:38