如何过滤JSON对象

时间:2014-12-11 10:01:58

标签: java json

我有一个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列表?

5 个答案:

答案 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)

您无法使用可用的Json library进行游戏,您所能做的只是将其转换为某些POJO或说Map。参考this

我也找到了here的东西。它也可能对你有所帮助。

答案 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"
} ]