JSON字符串转仅含部分属性的Person类列表的简便反序列化方法
当然有简便方法啦!不同编程语言的主流JSON序列化库都提供了忽略多余字段的能力,不用手动逐个处理JSON对象,和你之前反序列化带id的Person类一样简单。下面分几种常用场景给你说明:
解决方法
1. Java(Jackson库)
Jackson是Java生态里最常用的JSON处理库,两种方式都很简便:
快速忽略所有未知字段
直接给Person类添加注解,让Jackson自动跳过类中未定义的字段(包括id):import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @JsonIgnoreProperties(ignoreUnknown = true) public class Person { private String name; private String dob; private String sex; // 构造器、Getter、Setter省略 }反序列化代码和之前完全一样:
ObjectMapper mapper = new ObjectMapper(); List<Person> personList = mapper.readValue(jsonString, new TypeReference<List<Person>>() {});精准指定要保留的字段
如果想更严谨,只映射name、dob、sex三个字段,可以用字段过滤:import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; // 先给Person类标记过滤器 @JsonFilter("personFilter") public class Person { private String name; private String dob; private String sex; // 构造器、Getter、Setter省略 } // 反序列化时配置过滤器 ObjectMapper mapper = new ObjectMapper(); SimpleFilterProvider filterProvider = new SimpleFilterProvider() .addFilter("personFilter", SimpleBeanPropertyFilter.filterOutAllExcept("name", "dob", "sex")); mapper.setFilterProvider(filterProvider); List<Person> personList = mapper.readValue(jsonString, new TypeReference<List<Person>>() {});
2. C#(Newtonsoft.Json库)
用Json.NET(Newtonsoft.Json)的话,操作同样简单:
忽略未知字段
给Person类添加注解,自动跳过未定义的id字段:using Newtonsoft.Json; [JsonIgnoreProperties(UnknownIgnore = true)] public class Person { public string Name { get; set; } public string Dob { get; set; } public string Sex { get; set; } }反序列化代码和之前一致:
List<Person> personList = JsonConvert.DeserializeObject<List<Person>>(jsonString);仅映射指定字段
也可以给需要的属性标注[JsonProperty],未标注的字段会被自动忽略:using Newtonsoft.Json; public class Person { [JsonProperty] public string Name { get; set; } [JsonProperty] public string Dob { get; set; } [JsonProperty] public string Sex { get; set; } }
3. Python(Pydantic/标准库)
Python里用Pydantic库是最省心的选择,自动忽略多余字段:
from pydantic import BaseModel import json class Person(BaseModel): name: str dob: str sex: str # 直接反序列化即可,自动跳过id字段 json_str = '[{"id":1,"name":"Johnny","dob":"12/10/1986","sex":"Male"},{"id":2,"name":"Sarah","dob":"3/7/1979","sex":"Female"}]' person_list = list[Person].model_validate_json(json_str)
如果只用标准库json模块,也可以靠字典推导过滤字段:
from dataclasses import dataclass import json @dataclass class Person: name: str dob: str sex: str def load_persons(json_str): json_data = json.loads(json_str) return [Person(**{k:v for k,v in item.items() if k in ['name','dob','sex']}) for item in json_data]
内容的提问来源于stack exchange,提问作者C. Dodds
相关产品推荐
相关产品推荐

