如何为非数组格式的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
相关产品推荐
相关产品推荐

