LoginSignup
2
0

More than 3 years have passed since last update.

Java 入れ子のBeanをaaa.bbb[0].cccの形式に変換する

Last updated at Posted at 2020-02-03

はじめに

  • 入れ子のBeanをaaa.bbb[0].cccの形式に変換する必要があるためとりあえず試作したもののためバグがあるかもしれません
  • 想定している型は下記になります
    • 親Beanのメンバ変数にString or List or 子Bean or List<子Bean>
Bean0.java
@Data
public class Bean0 {
    private List<Bean1> listBean1;
}
Bean1.java
@Data
public class Bean1 {
    private String id;
    private String name;
    private List<String> list;
    private Bean2 bean2;
    private List<Bean2> listBean2;
}
Bean1.java
@Data
public class Bean2 {
    private String count;
    private List<String> hogeList;
}
Bean1Test.java
@SpringBootTest
public class Bean1Test {


    @Test
    public void hoge() throws IllegalArgumentException, IllegalAccessException {
        Bean0 b0 = new Bean0();
        List<Bean1> list = new ArrayList<Bean1>();
        for(int i = 0; i <= 2; i++) {
            Bean1 b1 = new Bean1();

            b1.setId("" + i);
            b1.setName("ほげ太郎" + i);
            b1.setList(new ArrayList<String>(Arrays.asList("aaa", "bbb", "ccc")));

            Bean2 b2 = new Bean2();
            b2.setCount("10" + i);
            b2.setHogeList(Arrays.asList("1" + i));

            b1.setBean2(b2);

            List<Bean2> listb2 = new ArrayList<Bean2>();
            Bean2 b21 = new Bean2();
            b21.setCount("101" + i);
            b21.setHogeList(Arrays.asList("11" + i, "12" + i));
            listb2.add(b21);

            Bean2 b22 = new Bean2();
            b22.setCount("102" + i);
            b22.setHogeList(Arrays.asList("101" + i, "1001" + i, "10001" + i));
            listb2.add(b22);

            b1.setListBean2(listb2);
            list.add(b1);
        }
        b0.setListBean1(list);

        try {
            List<String> ret = getFieldNameValue(b0);
            for(String str: ret) {
                System.out.println(str);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    private List<String> getFieldNameValue(Object obj) throws IllegalArgumentException, IllegalAccessException {
        List<String> list = new ArrayList<String>();
        Field[] fields = obj.getClass().getDeclaredFields();
        for(Field f : fields) {
            f.setAccessible(true);
            Object val = f.get(obj);
            if(f.getType().equals(String.class)) {
                list.add(f.getName() + ":" + val);
            }
            else if(f.getType().equals(List.class)) {
                int i = 0;
                int j = 0;
                if(null == f.get(obj)) continue;
                for(Object obj2: (List<Object>)val) {
                    if(obj2.getClass().equals(String.class)) {
                        list.add(f.getName() + "[" + i++ + "]:" + obj2.toString());
                    }
                    else {
                        List<String> list2 = getFieldNameValue(obj2);
                        List<String> list3 = new ArrayList<String>();
                        for(String str2 : list2) {
                            list3.add(f.getName() + "[" + j + "]" + "." + str2);
                        }
                        list.addAll(list3);
                        j++;
                    }
                }
            } else {
                List<String> list2 = getFieldNameValue(val);
                List<String> list3 = new ArrayList<String>();
                for(String str2 : list2) {
                    list3.add(f.getName() + "." + str2);
                }
                list.addAll(list3);
            }
        }
        return list;
    }
}

- JUnitの実行結果

listBean1[0].id:0
listBean1[0].name:ほげ太郎0
listBean1[0].list[0]:aaa
listBean1[0].list[1]:bbb
listBean1[0].list[2]:ccc
listBean1[0].bean2.count:100
listBean1[0].bean2.hogeList[0]:10
listBean1[0].listBean2[0].count:1010
listBean1[0].listBean2[0].hogeList[0]:110
listBean1[0].listBean2[0].hogeList[1]:120
listBean1[0].listBean2[1].count:1020
listBean1[0].listBean2[1].hogeList[0]:1010
listBean1[0].listBean2[1].hogeList[1]:10010
listBean1[0].listBean2[1].hogeList[2]:100010
listBean1[1].id:1
listBean1[1].name:ほげ太郎1
listBean1[1].list[0]:aaa
listBean1[1].list[1]:bbb
listBean1[1].list[2]:ccc
listBean1[1].bean2.count:101
listBean1[1].bean2.hogeList[0]:11
listBean1[1].listBean2[0].count:1011
listBean1[1].listBean2[0].hogeList[0]:111
listBean1[1].listBean2[0].hogeList[1]:121
listBean1[1].listBean2[1].count:1021
listBean1[1].listBean2[1].hogeList[0]:1011
listBean1[1].listBean2[1].hogeList[1]:10011
listBean1[1].listBean2[1].hogeList[2]:100011
listBean1[2].id:2
listBean1[2].name:ほげ太郎2
listBean1[2].list[0]:aaa
listBean1[2].list[1]:bbb
listBean1[2].list[2]:ccc
listBean1[2].bean2.count:102
listBean1[2].bean2.hogeList[0]:12
listBean1[2].listBean2[0].count:1012
listBean1[2].listBean2[0].hogeList[0]:112
listBean1[2].listBean2[0].hogeList[1]:122
listBean1[2].listBean2[1].count:1022
listBean1[2].listBean2[1].hogeList[0]:1012
listBean1[2].listBean2[1].hogeList[1]:10012
listBean1[2].listBean2[1].hogeList[2]:100012
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0