我有一个JSON对象,它是具有Name,FName,City,Class,Contact的学生列表。 现在我想只过滤属于特定城市的对象(学生)。我可以过滤邮件json对象
{
"Students": [
{
"id": 1,
"Name": "Student1",
"FName": "FName1",
"Class": "I",
"City": "Delhi"
},
{
"id": 2,
"Name": "Student2",
"FName": "FName2",
"Class": "II",
"City": "Mumbai"
},
{
"id": 3,
"Name": "Student3",
"FName": "FName3",
"Class": "II",
"City": "Delhi"
},
{
"id": 4,
"Name": "Student4",
"FName": "FName4",
"Class": "III",
"City": "Mumbai"
}
]
}
如何获得属于德里市的学生子json列表?
答案 0 :(得分:3)
如果您正在使用Java 8,则以下工作(注意:我使用的是Jackson,但只要您的JSON库返回JSON对象的Map对象,此示例仍然可用):
// These 2 lines are Jackson specific
ObjectMapper mapper = new ObjectMapper();
Map obj = mapper.readValue(s, Map.class);
List<Object> students = (List<Object>) obj.get("Students");
Object[] delhiStudents = students
.stream()
.filter(student -> ((Map)student).get("City").equals("Delhi"))
.toArray();
答案 1 :(得分:1)
使用JSONPath选项如下所示:
JsonPath.read(jsonAsString, "$.Students[?(@.City==Delhi)]")
答案 2 :(得分:0)
答案 3 :(得分:0)
如果您不介意使用第三方库,则可以使用GSON。您需要做的是为Gson对象提供自定义反序列化器。此反序列化器将排除所有具有JSON表示中特定城市值的Student对象。
public class Test {
public static void main(String[] args) throws Exception {
Type type = new TypeToken<List<Student>>() {}.getType();
Gson gson = new GsonBuilder().registerTypeAdapter(type, new Student.StudentListDeserializer("Mumbai")).create();
List<Student> list = gson.fromJson(new FileReader("myJson.json"), type);
System.out.println(list);
}
}
class Student {
private long id;
private String Name;
private String FName;
private String Class;
private String City;
@Override
public String toString() {
return "Student [id=" + id + ", Name=" + Name + ", FName=" + FName
+ ", Class=" + Class + ", City=" + City + "]";
}
static class StudentListDeserializer implements JsonDeserializer<List<Student>>{
private Set<String> forbiddenCities;
public StudentListDeserializer(String... forbiddenCities) {
this.forbiddenCities = new HashSet<>(Arrays.asList(forbiddenCities));
}
@Override
public List<Student> deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
List<Student> list = new ArrayList<>();
for(JsonElement e : json.getAsJsonObject().get("Students").getAsJsonArray()) {
if(!forbiddenCities.contains(e.getAsJsonObject().get("City").getAsString())) {
list.add(context.deserialize(e, Student.class));
}
}
return list;
}
}
}
输出:
[Student [id=1, Name=Student1, FName=FName1, Class=I, City=Delhi], Student [id=3, Name=Student3, FName=FName3, Class=II, City=Delhi]]
答案 4 :(得分:0)
您可以使用DSM库。通过使用它,您可以在读取JSON数据时过滤JSON。
假设您为学生开设了POJO课程。学生字段与JSON数据不完全匹配。
学生班
public class Student {
private long id;
private String name;
private String firstName;
private String className;
private String city;
// getter/setter
}
您将定义一个Yaml文件,其中包含json和Student类之间的映射定义。
result:
type: array # result is list
path: /Students
filter: self.data.city=='Delhi' # filter by city field of class
fields:
id: long # id is long and path is the same as json id field.
name:
path: Name
firstName:
path: FName
className:
path: Class
city:
path: City
使用DSM 过滤JSON并反序列化到学生类
DSM dsm=new DSMBuilder(new File("student.yaml")).create(Student.class);
List<Student> students= (List<Student>)dsm.toObject(new File("student.json");
以下是学生列表,这些列表已转换为json。
[ {
"id" : 1,
"name" : "Student1",
"className" : "I",
"city" : "Delhi",
"firstName" : "FName1"
}, {
"id" : 3,
"name" : "Student3",
"className" : "II",
"city" : "Delhi",
"firstName" : "FName3"
} ]