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

如何为非数组格式的items创建模型类并转为数组处理?

如何将带数字键的对象转换为数组的模型类处理方案

针对你遇到的items是带数字键的对象而非数组的情况,以下是主流编程语言中通过模型类将其转换为数组的实现方案:

Java(Jackson框架)

利用Jackson的@JsonAnySetter注解捕获items对象下的所有键值对,将其收集为列表:

import com.fasterxml.jackson.annotation.JsonAnySetter;
import java.util.ArrayList;
import java.util.List;

public class ResponseModel {
    private List<Item> items = new ArrayList<>();

    @JsonAnySetter
    public void addItem(String key, Item item) {
        items.add(item);
    }

    public static class Item {
        private String title;

        // Getter & Setter
        public String getTitle() { return title; }
        public void setTitle(String title) { this.title = title; }
    }

    public List<Item> getItems() { return items; }
}

解析示例:

import com.fasterxml.jackson.databind.ObjectMapper;

public class Demo {
    public static void main(String[] args) throws Exception {
        String json = "{\"items\":{\"01\":{\"title\":\"One\"},\"02\":{\"title\":\"Two\"},\"03\":{\"title\":\"Three\"},\"04\":{\"title\":\"Four\"}}}";
        ObjectMapper mapper = new ObjectMapper();
        ResponseModel response = mapper.readValue(json, ResponseModel.class);
        
        // 此时response.getItems()即为目标数组形式
        System.out.println(response.getItems());
    }
}

Python(Pydantic库)

通过root_validator或自定义字段类型,将字典转换为列表:

方案1:使用root_validator

from pydantic import BaseModel, root_validator
from typing import List, Dict

class Item(BaseModel):
    title: str

class ResponseModel(BaseModel):
    items: Dict[str, Item]

    @root_validator(skip_on_failure=True)
    def convert_to_list(cls, values):
        items_dict = values.get("items")
        if items_dict:
            # 按数字键排序,保证顺序与原JSON一致
            sorted_keys = sorted(items_dict.keys())
            values["items"] = [items_dict[key] for key in sorted_keys]
        return values

方案2:自定义字段类型

from pydantic import BaseModel
from typing import List, Dict, Any

class Item(BaseModel):
    title: str

class ItemsList(List[Item]):
    @classmethod
    def __get_validators__(cls):
        yield cls.validate

    @classmethod
    def validate(cls, v: Dict[str, Any]) -> List[Item]:
        if isinstance(v, dict):
            sorted_keys = sorted(v.keys())
            return [Item(**v[key]) for key in sorted_keys]
        raise ValueError("Expected a dictionary for items")

class ResponseModel(BaseModel):
    items: ItemsList

使用示例:

json_str = '''
{
  "items": {
    "01": {"title": "One"},
    "02": {"title": "Two"},
    "03": {"title": "Three"},
    "04": {"title": "Four"}
  }
}
'''
response = ResponseModel.parse_raw(json_str)
print(response.items)
# 输出:[Item(title='One'), Item(title='Two'), Item(title='Three'), Item(title='Four')]

注意:如果需要严格保持原JSON中数字键的顺序,记得对字典的键进行排序,避免因语言默认字典遍历顺序导致的元素顺序混乱。

内容的提问来源于stack exchange,提问作者user5721807

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:50:25