欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【Java】利用json工具类,传入字段名,获取集合中的对象属性值集合

程序员文章站 2022-05-18 18:47:21
经常需要在对象集合中,将某个对象的一个或多个属性值抽出来扔到一个集合中。代码如下: 一个属性值: Set set = new HashSet<>(); for (User user : users) { set.add(user.getId()); } 多个属性值: List

  经常需要在对象集合中,将某个对象的一个或多个属性值抽出来扔到一个集合中。代码如下:

  一个属性值:

        set<integer> set = new hashset<>();
        for (user user : users) {
            set.add(user.getid());
        }

  多个属性值:

        list<map<string, object>> list = new arraylist<>();
        for (user user : users) {
            map<string, object> map = new hashmap<>();
            map.put("id", user.getid());
            map.put("name", user.getname());
            list.add(map);
        }

  

  现在写一个利用json工具类,传入字段名,获取集合中的对象属性值集合的工具类。

  1. 添加json依赖

<dependency>
    <groupid>com.alibaba</groupid>
    <artifactid>fastjson</artifactid>
    <version>${fastjson.version}</version>
</dependency>

  2.工具类

import com.alibaba.fastjson.jsonarray;
import com.alibaba.fastjson.jsonobject;

import java.util.*;

/**
 *@author: lzf
 *@date: 2020/4/8 10:58
 *@description: 通过字段名,将集合中的值抽出。利用阿里巴巴json工具类,未直接使用反射
 */
public class propertyutil {

    /**
     * 描述: 通过字段名,将集合中的值抽出,放在set<string>集合中
     * @param collection 资源集合
     * @param property 目标字段名
     * @return java.util.set<java.lang.string>
     * @date: 2020/4/8 14:10
     */
    public static set<string> getstringvalueset(collection<?> collection, string property) {
        set<string> paramset = new hashset<>();
        if (collection != null && !collection.isempty()) {
            jsonarray array = (jsonarray) jsonobject.tojson(collection);
            for (int i = 0; i < array.size(); i++) {
                jsonobject object = array.getjsonobject(i);
                if (object.getstring(property) != null) {
                    paramset.add(object.getstring(property));
                }
            }
        }
        return paramset;
    }

    /**
     * 描述: 通过字段名,将集合中的值抽出,放在set<integer>集合中
     * @param collection 资源集合
     * @param property 目标字段名
     * @return java.util.set<java.lang.integer>
     * @date: 2020/4/8 14:09
     */
    public static set<integer> getintegervalueset(collection<?> collection, string property) {
        set<integer> paramset = new hashset<>();
        if (collection != null && !collection.isempty()) {
            jsonarray array = (jsonarray) jsonobject.tojson(collection);
            for (int i = 0; i < array.size(); i++) {
                jsonobject object = array.getjsonobject(i);
                if (object.getinteger(property) != null) {
                    paramset.add(object.getinteger(property));
                }
            }
        }
        return paramset;
    }

    /**
     * 描述:将对象的属性值放在map中
     *      return [{"id",123,"name":"张三","status":"1"},{...}]
     * @param collection 资源集合
     * @param properties 目标字段名
     * @return java.util.list<java.util.map<java.lang.string,java.lang.object>>
     * @date: 2020/4/8 14:09
     */
    public static list<map<string, object>> getstringpropertymap(collection<?> collection, string... properties) {
        list<map<string, object>> datalist = new arraylist<>();
        if (collection != null && !collection.isempty()) {
            jsonarray array = (jsonarray) jsonobject.tojson(collection);
            for (int i = 0; i < array.size(); i++) {
                jsonobject object = array.getjsonobject(i);
                map<string, object> map = new hashmap<>();
                for (string property : properties) {
                    map.put(property, object.get(property));
                }
                if (!map.isempty()) {
                    datalist.add(map);
                }
            }
        }
        return datalist;
    }
}

  3.新建一个对象user用来测试

/**
 * @author: lzf
 * @date: 2020/4/8 11:38
 * @description: 测试对象
 */
public class user {
    private integer id;
    private string name;

    public integer getid() {
        return id;
    }

    public void setid(integer id) {
        this.id = id;
    }

    public string getname() {
        return name;
    }

    public void setname(string name) {
        this.name = name;
    }
}

  4.生成测试类

import java.util.*;

/**
 * @author: lzf
 * @date: 2020/4/8 11:37
 * @description:
 */
public class propertyutiltest {

    public static void main(string[] args) {
        list<user> users = inituserlist();

        system.out.println("integer属性:" + propertyutil.getintegervalueset(users, "id").tostring());
        system.out.println("string属性:" + propertyutil.getstringvalueset(users, "name").tostring());
        system.out.println("string属性map:" + propertyutil.getstringpropertymap(users, "id", "name").tostring());
    }

    /**
     * 描述:生成 测试数据
     * @param
     * @return java.util.list<user>
     * @date: 2020/4/8 14:36
     */
    private static list<user> inituserlist() {
        list<user> list = new arraylist<>();
        for (int i = 0; i < 10; i++) {
            user user = new user();
            user.setid(i);
            user.setname("user_" + i);
            list.add(user);
        }
        return list;
    }
}

  5.输出

integer属性:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
string属性:[user_4, user_5, user_6, user_7, user_8, user_9, user_0, user_1, user_2, user_3]
string属性map:[{name=user_0, id=0}, {name=user_1, id=1}, {name=user_2, id=2}, {name=user_3, id=3}, {name=user_4, id=4}, {name=user_5, id=5}, {name=user_6, id=6}, {name=user_7, id=7}, {name=user_8, id=8}, {name=user_9, id=9}]

 

  简单的写了三个方法,如果有其他需求可以自行完善修改代码。