动态封装对象,属性来自json

news/2024/5/19 5:19:42 标签: java, 反射

需求: 如何动态的获取一个对象的字段,假如一个对象里面有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` 方法。你可以根据你的实际需求修改代码以适应你的对象结构和命名规则。


http://www.niftyadmin.cn/n/5018464.html

相关文章

springboot第36集:kafka,JSAPI支付,nginx,微服务Feign与flutter安卓App开发2

去思考自己的项目有哪些让你觉得不好的地方&#xff0c;然后去解决它&#xff0c;而非学习了一堆原理&#xff0c;展示技术能力比展示技术知识更有说服力 其实边解决问题边记录&#xff0c;是一个好习惯&#xff0c;不仅可以在解决问题的时候&#xff0c;方便回顾和查找&#x…

js农历与阳历转换使用笔记

1、新建utils/dateChange.js /*** 1900-2100区间内的公历、农历互转* charset UTF-8* Author jiangjiazhi* 公历转农历&#xff1a;calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0]* 农历转公历&#xff1a;calendar.lunar2solar(1987,09,10); //[…

模电课程设计

主要内容跟本科实验关系很大&#xff0c;可以用来借鉴。 包含文件有&#xff1a;实验报告、Multisim仿真文件&#xff0c;资料很全&#xff0c;有问题可以私信 目录 1、模电课设&#xff1a;用Multisim简单了解二极管 2、模电课设&#xff1a;用Multisim简析三极管与场效应…

编程初学者指南(2023版):零基础小白如何学习编程-两万字详述

文章目录 1.写在前面1.1 为什么有这份指南1.2 指南里有什么1.3 关于软件协会1.4 面对人生&#x1f340; 对工作&#xff1a;越努力越幸运&#x1f340; 对感情&#xff1a;爱得厚重开阔&#x1f340; 对他人&#xff1a;保持尊重、友好、真诚和谦逊&#x1f340; 对生活&#x…

DQN模型

1. DQN模型 References [1] 强化学习第五节&#xff08;DQN&#xff09;【个人知识分享】_哔哩哔哩_bilibili

使用mybatisplus进行分页查询total总为0的原因而且分页不起任何作用 是因为mybatis-plus插件没有起作用

使用mybatisplus进行分页查询total总为0的原因而且分页不起任何作用 是因为mybatis-plus插件没有起作用 解决办法 分页插件的错误配置类没有添加注解 下面是正确的实例 Configuration public class PageConfig {/*** 分页插件*/Beanpublic PaginationInterceptor paginationI…

ICC2: ICG clone与ICG merge

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 默认情况下,initial_place阶段或者在spg flow的initial_opt阶段工具会自动merge clock gating cell。但是如果在place_opt之前使用merge_clock_gates命令了,place阶段就不会再merge clock gate了。…

Spring Boot + Vue的网上商城之物流系统实现

Spring Boot Vue的网上商城之物流系统实现 思路 当构建一个物流系统时&#xff0c;我们可以按照以下步骤进行&#xff1a; 设计数据模型&#xff1a;首先确定系统中需要存储的数据&#xff0c;例如物流公司信息、物流订单信息等。根据需求设计相应的数据模型&#xff0c;包括…