需求: 如何动态的获取一个对象的字段,假如一个对象里面有name,age,sex三个字段,我想取name的值,这个name是存在一个json中,json的格式如下[{"key":"name"},{"key":"age"},{"key":"sex"}]先遍历这个json,然后再根据key的值,取对象中对应的属性值。 也就是获取json对应的key的value,封装到对象中。
GPT给出的答案:
java">在 Java 中,你可以按照以下步骤动态获取一个对象的字段:
1. 遍历 JSON 数组,获取每个对象的 `key` 值。
2. 使用获取到的 `key` 值作为属性名称,利用 Java 反射机制获取对象的对应属性值。
下面是一个示例代码:
```java
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class Main {
public static void main(String[] args) throws Exception {
String jsonStr = "[{\"key\":\"name\"},{\"key\":\"age\"},{\"key\":\"sex\"}]";
ObjectMapper objectMapper = new ObjectMapper();
List<JsonNode> data = objectMapper.readValue(jsonStr, List.class);
Person person = new Person("John", 25, "male");
for (JsonNode item : data) {
String key = item.get("key").asText();
Object value = getValueByKey(person, key);
System.out.println(key + ": " + value);
}
}
public static Object getValueByKey(Object obj, String key) throws Exception {
return obj.getClass().getMethod("get" + capitalize(key)).invoke(obj);
}
public static String capitalize(String str) {
if (str == null || str.isEmpty()) {
return str;
}
return Character.toUpperCase(str.charAt(0)) + str.substring(1);
}
}
class Person {
private String name;
private int age;
private String sex;
public Person(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getSex() {
return sex;
}
}
```
这段代码将输出:
```
name: John
age: 25
sex: male
```
请注意,上述代码中的 `Person` 类是一个简单的示例,具有 `name`、`age` 和 `sex` 三个字段,并为每个字段提供了对应的 `get` 方法。你可以根据你的实际需求修改代码以适应你的对象结构和命名规则。
问题: 基于上面的问题,那要是想设置对象属性值呢?
GPT的答案:
java">如果你想设置对象的属性值,你可以按照以下步骤进行操作:
1. 遍历 JSON 数组,获取每个对象的 `key` 值和对应的属性值。
2. 使用获取到的 `key` 值作为属性名称,利用 Java 反射机制设置对象的属性值。
下面是一个示例代码:
```java
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class Main {
public static void main(String[] args) throws Exception {
String jsonStr = "[{\"key\":\"name\",\"value\":\"John\"},{\"key\":\"age\",\"value\":25},{\"key\":\"sex\",\"value\":\"male\"}]";
ObjectMapper objectMapper = new ObjectMapper();
List<JsonNode> data = objectMapper.readValue(jsonStr, List.class);
Person person = new Person();
for (JsonNode item : data) {
String key = item.get("key").asText();
Object value = item.get("value").asText();
setValueByKey(person, key, value);
}
System.out.println(person);
}
public static void setValueByKey(Object obj, String key, Object value) throws Exception {
obj.getClass().getMethod("set" + capitalize(key), value.getClass()).invoke(obj, value);
}
public static String capitalize(String str) {
if (str == null || str.isEmpty()) {
return str;
}
return Character.toUpperCase(str.charAt(0)) + str.substring(1);
}
}
class Person {
private String name;
private int age;
private String sex;
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
```
这段代码将输出:
```
Person{name='John', age=25, sex='male'}
```
请注意,上述代码中的 `Person` 类是一个简单的示例,具有 `name`、`age` 和 `sex` 三个字段,并为每个字段提供了对应的 `get` 和 `set` 方法。你可以根据你的实际需求修改代码以适应你的对象结构和命名规则。