[alibaba/fastjson]根据不同的场景,排除或者包括返回对象的字段。

2025-11-25 47 views
5

根据不同的场景,排除或者包括返回对象的字段。在controller方法中加入

@RequestMapping("/demo")
@ResponseBody
@FastJsonView(exclude = {@FastJsonFilter(clazz = JSON.class,props = {"data"})})
//@FastJsonView(include = {@FastJsonFilter(clazz = JSON.class,props = {"data"})})
public JSON demo(){
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("code", 0);
        jsonObject.put("data", pager);
}

返回的json不包含data属性

回答

3

@VictorZeng 帮忙看一下?

9

@VictorZeng 这个就是在根据SimplePropertyPreFilter进行的扩展。 如果直接使用SimplePropertyPreFilter这个方式,需要在controller层返回对象之前先转换成String类型,或者通过类级别的SerializeConfig指定需要返回的字段,大师返回的字段是固定的,不能动态指定返回的字段。 这块修改的代码是在运行时动态包含返回的字段或者动态排除返回的字段,比如一个Person类,里面有name属性和age属性,通过注解,我可以指定在一个方法返回时只返回name另一个方法只返回age属性。这种方式上面说的方式应该不能处理。

7

@yanquanyu @JSONField 看看这个是不是你想要的

2

@yanquanyu 我明天你的意思了 同一个PO类 不同的方法返回的属性不同 目前fastjson应该是不行的 但是为什么不能用2个PO来描述这个场景呢? 如果必须这样的话 请提供一下testcase

9

@VictorZeng 就是想简化代码,少写PO,直接可以通过实体bean按指定的字段返回,不用中间各层bean的转换了,而且也不暴露不需要显示的字段信息。

1

@VictorZeng 已提交testcase

5

@VictorZeng 我也有经常有这样的需求,根据不同的场景,排除或者包括返回对象的字段,比如下面的示例代码:

private static JSONArray removeUselessUserInfo(JSONArray originJsonArr){
        JSONArray destJsonArr = new JSONArray();
        if (originJsonArr != null && !originJsonArr.isEmpty()){
            for (int i = 0; i < originJsonArr.size(); i++) {
                JSONObject userJson = originJsonArr.getJSONObject(i);
                userJson.remove("phone");
                userJson.remove("about");
                userJson.remove("lastlogin");
                userJson.remove("lastLoginType");
                userJson.remove("lastLoginType");
                userJson.remove("email");
                userJson.remove("firstlogin");
                userJson.remove("coverUrl");
                userJson.remove("createdTime");
                userJson.remove("state");
                userJson.remove("equipmentType");
                userJson.remove("recommendTime");
                userJson.remove("contestCount");
                destJsonArr.add(userJson);
            }
        }
        return destJsonArr;
    }

其实我只是想要JSONObject中的两个字段,比如 userName,nickeName,我不得不采用类似的方法把JSONObject不需要的key全部remove掉,或者采用如下的方式:

public static JSONArray removeUselessTribeContestInfo(JSONArray userArr) {
        if (userArr != null  && !userArr.isEmpty()){
            JSONArray destJsonArr = new JSONArray();
            for (int i = 0; i < userArr.size(); i++) {
                User User = JSON.toJavaObject(userArr.getJSONObject(i),User.class);
                SimplePropertyPreFilter filter = new SimplePropertyPreFilter(User.class,"userName","nickeName");
                JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(User,filter));
                destJsonArr.add(jsonObject);
            }
            return destJsonArr;
        }
        return userArr;
    }

我觉得如果能够在JSONObject中扩展一个removeExcept(String... properties),这样是最好的。 这样当需要转换的pojo中的字段很多的时候,而我需要保留很多字段的时候,我只需要用remove(String),如果我需要保留很少的字段的时候,我只需要removeExcept(String... properties)即可,这样上述的代码就更为简洁:

public static JSONArray removeUselessTribeContestInfo(JSONArray userArr) {
        if (userArr != null  && !userArr.isEmpty()){
            JSONArray destJsonArr = new JSONArray();
            for (int i = 0; i < contestArr.size(); i++) {
               JSONObject userJson = originJsonArr.getJSONObject(i);
               userJson.removeExcept("userName","nickName");
                destJsonArr.add(jsonObject);
            }
            return destJsonArr;
        }
        return userArr;
    }
2

@felayman 你这种情况貌似SimplePropertyPreFilter 就可以实现吧

3

@wenshao OK 可以merge

5

@VictorZeng SimplePropertyPreFilter的确可以,但是总感觉很怪,因为需要转换两次,需要先把JSONObject转换成pojo,然后再把pojo转化成JSONObject

3

对于大量字段的POJO中取少量字段输出,多个POJO的字段拼出来的字段集合输出,修改类型或别名等等操作,,,

这些问题的最佳处理办法是,新加一个VO类型,这样既能满足语义的一致性(VO的结构与JSOn一致),又能在后续的其他变动中保持修改这个VO类型即可。

@yanquanyu @felayman