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

2023-11-08

需求: 如何动态的获取一个对象的字段,假如一个对象里面有name,age,sex三个字段,我想取name的值,这个name是存在一个json中,json的格式如下[{"key":"name"},{"key":"age"},{"key":"sex"}]先遍历这个json,然后再根据key的值,取对象中对应的属性值。  也就是获取json对应的key的value,封装到对象中。

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\"},{\"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的答案:

如果你想设置对象的属性值,你可以按照以下步骤进行操作:

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` 方法。你可以根据你的实际需求修改代码以适应你的对象结构和命名规则。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态封装对象,属性来自json 的相关文章

随机推荐

  • JPA常用注解

    JPA全称Java Persistence API JPA通过JDK 5 0注解或XML描述对象 关系表的映射关系 并将运行期的实体对象持久化到数据库中 JPA由EJB 3 0软件专家组开发 作为JSR 220实现的一部分 但它不囿于EJB
  • Python可视化中Matplotlib绘图(2.设置范围、标签、标题、图例(详细参数))

    1 为绘制的图添加范围 import matplotlib pyplot as plt 导入绘图模块 import numpy as np 导入需要生成数据的numpy模块 添加范围 y np arange 0 10 1 plt plot
  • Nginx中root和alias区别

    1 区别 共同点 root和alias两者都都是用来指定URI和磁盘文件的映射关系 区别 root会将定义路径与URI叠加 而alias只取定义路径 root示例 客户端请求www test com images 1 jpg 则对应磁盘映射
  • 测试今年这行情,不会自动化测试的要做好心理准备了!

    双喜是一名软件测试工程师 入行之后在一家小型公司工作了五年 这段时间里 他主要负责手工测试和一些简单的自动化测试工作 由于公司项目也相对简单 他逐渐陷入了工作的舒适区 没有积极追求新的知识和技能 然而随着身边朋友发展的越来越好 双喜也决定走
  • Python初级第14课——继承(只读课堂)

    欢迎来到 只读课堂 In 1 这节课给大家讲面向对象中的一个继承的理念 class A 在python3中 默认的基类如果括号没有 那么继承自python的object类 pass class A1 A 继承自A类 pass A1 base
  • Scott自学python——字典学习笔记

    字典是Python的中重要的一种数据类型 可以存储任意对像 字典是以键值对的形式创建的 key value 利用大括号包裹着 字典中找某个元素时 是根据键 值字典的每个元素由2部分组成 键 值 访问值的安全方式get方法 在我们不确定字典中
  • 计算机怎样存储数值,(二)计算机如何保存字符和数字,并完成计算

    1 保存字符 计算机在创建之初 只能显示英文字母和特殊字符 后来慢慢才有了其他语言 但是打开网页或者编辑器却可能出现乱码 我们知道计算机只能保存0和1 那么如何把字符保存成二进制 以及如何把二进制解码成对应的字符就是先驱们所做的事情了 我们
  • AD采样的问题答案

    群友提问 请教一个AD采样的问题 现在想采样一个4 20mA的电流信号 信号调理电路如图1所示 输入电流与输出电压关系如图1中公式所示 现在遇到一个问题 当输入电流给定为4 7 93mA时 运放2脚的电压为0 954V Vout为0 652
  • NSIS简介

    1 简介 NSIS是一款帮助开发者创建Windows安装包的工具 NSIS通过NSIS脚本语言 NSIS Script 来配置安装过程中的信息 通过灵活的脚本方式 NSIS可以实现从最简单的文件拷包制作 到需要读写注册表 配置环境变量 以及
  • 局部变量错误

    参考 局部变量错误 云 社区 腾讯云 解析 UnboundLocalError local variable xxx referenced before assignment 在函数外部已经定义了变量n 在函数内部对该变量进行运算 运行时会
  • 计算机新代理大会优美句子,描写计算机教室的优美句子

    描写计算机教室的英语作文六句话怎么写 教室有两扇玻璃门 外边有鞋柜 教室两边各有一台空调 中间是三列 每列有20台电脑老师讲台上有一张桌子 桌子后面有一个大的放映屏幕天花板上有白色灯管 一共有9盏教室有8扇窗户教室里有52张凳子In eac
  • 利用docker 搭建File Browser 文件管理系统

    File Browser就是一个文件浏览器 因为linux并不方便桌面管理 所以Filebrowser就是帮助我们管理linux服务器上文件的程序 你可以称他为网盘程序 可以管理文件 可以分享文件 另外它还可以在线播放 mp4视频 下载fi
  • 云安全技术——执行ifconfig命令提示command not found

    安装完centOS 7 执行ifconfig命令提示command not found 解决办法 查找环境标量是否包含ifconfig 如下图 显示环境变量没有ifconfig 2 执行 yum search ifconfig 查找ifco
  • python mysql connection_Python MySQL连接访问

    将python应用程序连接到数据库有以下步骤 导入mysql connector模块 创建连接对象 创建游标对象 执行查询 创建连接 要在MySQL数据库和python应用程序之间创建连接 请使用mysql connector模块的conn
  • Python绘图系统10:在父组件中使用子组件的函数

    文章目录 Combobox绑定事件 互相调用 源代码 Python绘图系统 从0开始实现一个三维绘图系统 自定义控件 坐标设置控件 坐标列表控件 支持多组数据的绘图系统 图表类型和风格 散点图和条形图 混合类型图表 Combobox绑定事件
  • PMIC驱动之—PMIC硬件相关知识

    PMIC 电源管理集成电路 Power Management IC 在之前项目中 驱动最小系统 对于PMIC这块儿很懵懂 故抽时间查看一些优秀博文及资料 加强对电源管理的理解 本文介绍 PMIC 硬件电路相关的一些知识 在此作一些阶段性的学
  • 负载均衡入门

    提纲 ADC 行业现状 ADC 原理 ADC 的实现方式 为什么是 ADC 而不是负载均衡 功能的扩展 解决了什么问题 可用性 Availability 伸缩性 Scalability 性能 End user performance 数据中
  • Java-类什么时候被加载

    类什么时候被加载 类加载时机 生成该类对象的时候 会加载该类及该类的所有父类 访问该类的静态成员的时候 class forName 类名 加载完以后JVM中就有了该类的元数据 知道这个Class的成员变量和方法等信息 当要new一个类的实例
  • AIO, DIO, CIO

    复杂度3 5 机密度3 5 这些名词都用于数据 文件 访问的模式 既应用程序用什么方案实现对文件的读写 AIO AIO 的全称为 Asynchronous I O 既异步 I O 在 AIO 的工作模式下 应用程序发起 call I O请求
  • 动态封装对象,属性来自json

    需求 如何动态的获取一个对象的字段 假如一个对象里面有name age sex三个字段 我想取name的值 这个name是存在一个json中 json的格式如下 key name key age key sex 先遍历这个json 然后再根