遍历对象并获取其所有变量的值

10

我正在使用Gson将JSON对象数组解析为POJO。然后,我使用for-loop将每个解析的对象发送到一个处理方法中。我似乎找不到一种方法来循环遍历单个对象并获取其中包含的值。

例如:

private Double thing1;
private Double thing2;
private Dboule thing3;

private void doSomething(MyObject myObj){
 ...myObject contains thing1, thing2, thing3 which are each doubles.

//I want to loop through the entire object, 
//grab thing1's value and do something with it, then grab thing2's value... etc. 

 
}

这个可容易实现吗?我已经试了一段时间了,但好像不能让它工作。我可以使用以下方法轻松地逐个获取它们:

myObj.thing1

但需要使用循环来完成,因为会有大量的值进入。

更新:这个方法几乎有效,但是它会先打印整个对象,然后才打印单个对象的值。我该如何让它直接打印单个值而不是先打印所有内容?

for(Field field : data.getClass().getDeclaredFields()){
    Object value = field.get(data);
    System.out.println(value);        
}

输出:

    [{"accel_1":0.012,"accel_2":0.125,"accel_3":0.03,"accel_4":0.012,"accel_5":0.125,"accel_6":0.03,"accel_7":0.012,"accel_8":0.125,"accel_9":0.03,"accel_10":0.012,"accel_11":0.125,"accel_12":0.03},{"accel_1":0.18,"accel_2":0.26,"accel_3":0.05,"accel_4":0.18,"accel_5":0.26,"accel_6":0.05,"accel_7":0.18,"accel_8":0.26,"accel_9":0.05,"accel_10":0.18,"accel_11":0.26,"accel_12":0.05},{"accel_1":0.06,"accel_2":0.02,"accel_3":0.03,"accel_4":0.06,"accel_5":0.02,"accel_6":0.03,"accel_7":0.06,"accel_8":0.02,"accel_9":0.03,"accel_10":0.06,"accel_11":0.02,"accel_12":0.03}]
0.012
0.125
0.03
0.012
0.125
0.03
0.012
0.125
0.03
0.012
0.125
0.03
[{"accel_1":0.012,"accel_2":0.125,"accel_3":0.03,"accel_4":0.012,"accel_5":0.125,"accel_6":0.03,"accel_7":0.012,"accel_8":0.125,"accel_9":0.03,"accel_10":0.012,"accel_11":0.125,"accel_12":0.03},{"accel_1":0.18,"accel_2":0.26,"accel_3":0.05,"accel_4":0.18,"accel_5":0.26,"accel_6":0.05,"accel_7":0.18,"accel_8":0.26,"accel_9":0.05,"accel_10":0.18,"accel_11":0.26,"accel_12":0.05},{"accel_1":0.06,"accel_2":0.02,"accel_3":0.03,"accel_4":0.06,"accel_5":0.02,"accel_6":0.03,"accel_7":0.06,"accel_8":0.02,"accel_9":0.03,"accel_10":0.06,"accel_11":0.02,"accel_12":0.03}]
0.18
0.26
0.05
0.18
0.26
0.05
0.18
0.26
0.05
0.18
0.26
0.05
[{"accel_1":0.012,"accel_2":0.125,"accel_3":0.03,"accel_4":0.012,"accel_5":0.125,"accel_6":0.03,"accel_7":0.012,"accel_8":0.125,"accel_9":0.03,"accel_10":0.012,"accel_11":0.125,"accel_12":0.03},{"accel_1":0.18,"accel_2":0.26,"accel_3":0.05,"accel_4":0.18,"accel_5":0.26,"accel_6":0.05,"accel_7":0.18,"accel_8":0.26,"accel_9":0.05,"accel_10":0.18,"accel_11":0.26,"accel_12":0.05},{"accel_1":0.06,"accel_2":0.02,"accel_3":0.03,"accel_4":0.06,"accel_5":0.02,"accel_6":0.03,"accel_7":0.06,"accel_8":0.02,"accel_9":0.03,"accel_10":0.06,"accel_11":0.02,"accel_12":0.03}]
0.06
0.02
0.03
0.06
0.02
0.03
0.06
0.02
0.03
0.06
0.02
0.03

以下是完整的方法:

private void convertJSON(String jsonString) throws IllegalArgumentException, IllegalAccessException {
    Gson gson = new Gson();
    Type data = new TypeToken<ArrayList<MyObject>>(){}.getType();
    List<MyObject> fhd = gson.fromJson(jsonString, data);
    for(MyObject current : fhd){
        printIt(current);
    }
}

public void printIt(MyObject data) throws IllegalArgumentException, IllegalAccessException{
    for(Field field : data.getClass().getDeclaredFields()){
        Object value = field.get(data);
        System.out.println(value);       
    }
}
2个回答

10
您可以使用反射来实现这一点:
Field[] fields = games.getClass().getDeclaredFields();

for(Field field: fields) {
    //do stuff
}

getDeclaredFields():

返回一个 Field 对象数组,该数组反映由此 Class 对象表示的类或接口声明的所有字段。这包括公共的、受保护的、默认(包)访问和私有字段,但不包括继承的字段。


这几乎完成了。我更新了我的帖子。它快要完成了。 - user8072194
@MarcusHolden 你传递给 get() 方法的是什么?(data 是什么?) - GBlodgett
这是从对象数组中取出的一个对象。以下是模拟方法: public void printIt(MyObject data){ for(Field field : data.getClass().getDeclaredFields()){ Object value = field.get(data); System.out.println(value);
} }
- user8072194
@MarcusHolden 嗯,我无法重现这个问题。当我运行这段代码时,它只是简单地打印出字段。 - GBlodgett
为什么不在println语句中打印字段的名称,以便调试时可以知道完整对象的输出位置。例如:System.out.println(field.getName() + ": " + value); - maneesh
显示剩余3条评论

0

如果我理解正确,您正在尝试循环遍历对象的值。如果是这种情况,请按照以下方式编写您的方法:

private void doSomething(MyObject myObj)
{
    Double sum_of_values = 0;
    for (MyObject val : myObj) // "val" will be each Double value within the object.
    { 
        //I don't know what you want to do with the values of your object,
        //but below is an example of getting the sum of values within your object:
        sum_of_values += val; 
        //here I assumed that are values are Double, which in many cases they can be of any type.
        //Or you can send each value to another method and do your stuff there:
        someMethod(val);
        //Or maybe do something else.
    }
}
private void someMethod(Double val)
{
    //do things here.
{

希望这能给你一个想法


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接