Flutter中解析存在可选null字段的API返回JSON数据问题咨询
字段可选空的JSON解析方案
核心处理逻辑:把question字段定义为可空类型即可,主流JSON解析框架会自动适配null值和非空对象的转换,不需要额外做复杂的自定义解析逻辑。
以下是不同常用技术栈的实现示例:
1. Kotlin(Gson/Jackson/Moshi通用)
// 定义Question内部结构 data class Question( val id: String, val category: String, val text: String ) // 定义Video内部结构 data class Video( val id: String, val url: String, val thumbnail: String, val duration: Long ) // 定义列表条目外层结构,question加?标记为可空 data class ListItem( val type: String, val video: Video, val question: Question? )
直接按List<ListItem>类型解析JSON即可,业务逻辑使用前判断question是否为null再处理即可。
2. Java(Jackson示例)
// Question内部类 public class Question { private String id; private String category; private String text; // 省略getter、setter、无参构造方法 } // Video内部类 public class Video { private String id; private String url; private String thumbnail; private Long duration; // 省略getter、setter、无参构造方法 } // 外层条目类,Java引用类型默认支持null,无需额外标记 public class ListItem { private String type; private Video video; private Question question; // 省略getter、setter、无参构造方法 }
解析代码示例:
ObjectMapper objectMapper = new ObjectMapper(); List<ListItem> resultList = objectMapper.readValue(jsonStr, new TypeReference<List<ListItem>>(){});
3. Python(Pydantic v2示例)
from pydantic import BaseModel from typing import Optional, List class Question(BaseModel): id: str category: str text: str class Video(BaseModel): id: str url: str thumbnail: str duration: int class ListItem(BaseModel): type: str video: Video question: Optional[Question] # Optional标记为可空 # 解析逻辑 result_list: List[ListItem] = [ListItem(**item) for item in origin_json_list]
注意事项
- 不要将
question定义为非空类型,否则解析到首条null值时会直接抛出序列化失败异常 - 业务代码使用
question字段前先做非空判断,避免空指针/属性不存在异常 - 如果业务需要首条
question有默认值,可以在序列化框架中配置null值自动填充规则,比如Jackson的@JsonSetter(nulls = Nulls.SKIP)、Pydantic的default=默认值配置
内容的提问来源于stack exchange,提问作者Pation
相关产品推荐
相关产品推荐

