java中json和对象之间相互转换的运用

news2024/11/25 7:07:23

1.目录结构

在这里插入图片描述

2.配置相关文件

2.1.引入相关的pom文件

pom.xml

<dependencies>
        <!-- JSON -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.12.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.12.3</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.8</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.24</version>
        </dependency>

    </dependencies>

2.2.配置引入json文件工具类

PurUtil.java

package util;


import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class PurUtil {

    /**
     * 读取json文件方法
     * @param url
     * @return
     */
    public static  String readWithFileInputStream(String url){
        // 创建一个 File 对象,表示要读取的文件
        File file = new File(url);
        // 创建一个 StringBuilder 对象,用来存储读取到的字符串
        StringBuilder sb = new StringBuilder();
        try {
            // 创建一个 FileReader 对象,用来读取文件的字符流
            FileReader fr = new FileReader(file);
            // 创建一个 BufferedReader 对象,用来缓冲字符流,并提供按行读取的方法
            BufferedReader br = new BufferedReader(fr);
            // 定义一个变量,用来存储每行的内容
            String line;
            // 循环读取每一行,直到文件结束
            while ((line = br.readLine()) != null) {
                // 将每行的内容追加到 StringBuilder 中,并添加换行符
                sb.append(line).append("\n");
            }
            // 关闭 BufferedReader 和 FileReader
            br.close();
            fr.close();
        } catch (IOException e) {
            // 处理异常
            e.printStackTrace();
        }
        // 将 StringBuilder 转换为字符串,并打印输出
        String json = sb.toString();
        return json;
    }
}

2. 3.配置JSON和对象相互转化工具类

JsonUtil.java

package util;

import com.alibaba.fastjson.JSON;

public class JsonUtil {

    public static String getJson(Object object){
       return JSON.toJSONString(object);
    }

    public static <T> T fromJson(String json, Class<T> clazz) {
        return JSON.parseObject(json,clazz);
    }

}

2.4.配置java对象

Columns.java

package entity;

import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonProperty;

public class Columns {
    @JsonProperty("Name")
    private String name;

    @JsonProperty("Caption")
    private String caption;

    @JsonProperty("DataType")
    private String dataType;

    public Columns() {
    }

    public Columns(String name, String caption, String dataType) {
        this.name = name;
        this.caption = caption;
        this.dataType = dataType;
    }

    @JSONField(name = "Name")
    public String getName() {
        return name;
    }

    @JSONField(name = "Name")
    public void setName(String name) {
        this.name = name;
    }

    @JSONField(name = "Caption")
    public String getCaption() {
        return caption;
    }

    @JSONField(name = "Caption")
    public void setCaption(String caption) {
        this.caption = caption;
    }

    @JSONField(name = "DataType")
    public String getDataType() {
        return dataType;
    }

    @JSONField(name = "DataType")
    public void setDataType(String dataType) {
        this.dataType = dataType;
    }
}

IXbusPlanInfoBuild.java

package entity;


import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.ArrayList;
import java.util.List;

public class IXbusPlanInfoBuild{
    @JsonProperty("MessageHeader")
    private MessageHeader messageHeader;

    @JsonProperty("Tables")
    private List<Table> listTab;

    public IXbusPlanInfoBuild(){
      this.messageHeader=new MessageHeader();
      this.listTab=new ArrayList<Table>();
      Table table=new Table();
        this.listTab.add(table);
    }

    @JSONField(name = "MessageHeader")
    public MessageHeader getMessageHeader() {
        return messageHeader;
    }

    public void setMessageHeader(MessageHeader messageHeader) {
        this.messageHeader = messageHeader;
    }

    @JSONField(name = "Tables")
    public List<Table> getListTab() {
        return listTab;
    }

    @JSONField(name = "Tables")
    public void setListTab(List<Table> listTab) {
        this.listTab = listTab;
    }

}

MessageHeader.java

package entity;

import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonProperty;

public class MessageHeader {
    @JsonProperty("UUID")
    private String uuid;

    @JsonProperty("SvcName")
    private String svcName;

    @JsonProperty("Sender")
    private String sender;

    @JsonProperty("Receiver")
    private String receiver;

    @JsonProperty("MessageId")
    private String messageId;

    @JsonProperty("Msg")
    private String msg;

    @JsonProperty("Flag")
    private Integer flag;

    @JsonProperty("MessageTypeId")
    private String messageTypeId;

    @JsonProperty("SendDate")
    private String sendDate;

    @JsonProperty("SendTime")
    private String sendTime;

    @JSONField(name = "UUID")
    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    @JSONField(name = "SvcName")
    public String getSvcName() {
        return svcName;
    }

    public void setSvcName(String svcName) {
        this.svcName = svcName;
    }

    @JSONField(name = "Sender")
    public String getSender() {
        return sender;
    }

    public void setSender(String sender) {
        this.sender = sender;
    }

    @JSONField(name = "Receiver")
    public String getReceiver() {
        return receiver;
    }

    public void setReceiver(String receiver) {
        this.receiver = receiver;
    }

    @JSONField(name = "MessageId")
    public String getMessageId() {
        return messageId;
    }

    public void setMessageId(String messageId) {
        this.messageId = messageId;
    }

    @JSONField(name = "Msg")
    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    @JSONField(name = "Flag")
    public Integer getFlag() {
        return flag;
    }

    public void setFlag(Integer flag) {
        this.flag = flag;
    }

    @JSONField(name = "MessageTypeId")
    public String getMessageTypeId() {
        return messageTypeId;
    }

    public void setMessageTypeId(String messageTypeId) {
        this.messageTypeId = messageTypeId;
    }

    @JSONField(name = "SendDate")
    public String getSendDate() {
        return sendDate;
    }

    public void setSendDate(String sendDate) {
        this.sendDate = sendDate;
    }

    @JSONField(name = "SendTime")
    public String getSendTime() {
        return sendTime;
    }

    public void setSendTime(String sendTime) {
        this.sendTime = sendTime;
    }
}

Rows.java

package entity;

import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonProperty;

public class Rows {
    @JsonProperty("MESSAGE")
    private String message;

    @JsonProperty("ACCOUNT_PERIOD")
    private String accountPeriod;

    @JsonProperty("MSG_TYPE")
    private String msgType;

    @JsonProperty("MR_LINE_ID")
    private String mrLineId;

    @JsonProperty("RETURN_TIME")
    private String returnTime;

    @JsonProperty("SYSTEM_ID")
    private String systemId;



    @JSONField(name = "MESSAGE")
    public String getMessage() {
        return message;
    }

    @JSONField(name = "MESSAGE")
    public void setMessage(String message) {
        this.message = message;
    }

    @JSONField(name = "ACCOUNT_PERIOD")
    public String getAccountPeriod() {
        return accountPeriod;
    }

    @JSONField(name = "ACCOUNT_PERIOD")
    public void setAccountPeriod(String accountPeriod) {
        this.accountPeriod = accountPeriod;
    }

    @JSONField(name = "MSG_TYPE")
    public String getMsgType() {
        return msgType;
    }

    @JSONField(name = "MSG_TYPE")
    public void setMsgType(String msgType) {
        this.msgType = msgType;
    }

    @JSONField(name = "MR_LINE_ID")
    public String getMrLineId() {
        return mrLineId;
    }

    @JSONField(name = "MR_LINE_ID")
    public void setMrLineId(String mrLineId) {
        this.mrLineId = mrLineId;
    }

    @JSONField(name = "RETURN_TIME")
    public String getReturnTime() {
        return returnTime;
    }

    @JSONField(name = "RETURN_TIME")
    public void setReturnTime(String returnTime) {
        this.returnTime = returnTime;
    }

    @JSONField(name = "SYSTEM_ID")
    public String getSystemId() {
        return systemId;
    }

    @JSONField(name = "SYSTEM_ID")
    public void setSystemId(String systemId) {
        this.systemId = systemId;
    }
    
}

Table.java

package entity;

import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.ArrayList;
import java.util.List;

public class Table {
    @JsonProperty("Name")
    private String name;

    @JsonProperty("Columns")
    private List<Columns> listCol;

    @JsonProperty("Rows")
    private List<Rows> listRows;

    public Table(){
        this.listCol=new ArrayList<Columns>();
        this.listRows=new ArrayList<Rows>();
    }

    @JSONField(name = "Name")
    public String getName() {
        return name;
    }

    @JSONField(name = "Name")
    public void setName(String name) {
        this.name = name;
    }


    @JSONField(name = "Columns")
    public List<Columns> getListCol() {
        return listCol;
    }

    @JSONField(name = "Columns")
    public void setListCol(List<Columns> listCol) {
        this.listCol = listCol;
    }

    @JSONField(name = "Rows")
    public List<Rows> getListRows() {
        return listRows;
    }

    @JSONField(name = "Rows")
    public void setListRows(List<Rows> listRows) {
        this.listRows = listRows;
    }
}

说明: @JSONField在get方法进行设置,那么对象在转化为json格式的时候,将会按照JSONField设置的值进行转化;@JSONField在set方法设置,那么json格式字符串才会匹配注解上面一样的对象属性,然后对对象属性进行赋值。

2.5.配置测试工具类

2.5.1对象转化为json字符串

TestPut.java

package test;

import entity.*;
import util.JsonUtil;
import util.PurUtil;

import java.util.ArrayList;
import java.util.List;

public class TestPut {
    public static void main(String[] args) {
        String str2=JsonUtil.getJson(TestPut.getIXbusPlanInfoBuild());
        int a=1;
    }


    public static IXbusPlanInfoBuild getIXbusPlanInfoBuild(){
        IXbusPlanInfoBuild iXbusPlanInfoBuild=new IXbusPlanInfoBuild();
        MessageHeader messageHeader=new MessageHeader();
        messageHeader.setUuid("8ac4c0b689297e31018943de73433307");
        messageHeader.setSvcName("1012114110");
        messageHeader.setSender("1012");
        messageHeader.setReceiver("1141");
        messageHeader.setMessageId("");
        messageHeader.setMsg("");
        messageHeader.setFlag(0);
        messageHeader.setMessageTypeId("1012114110");
        messageHeader.setSendDate("20230711");
        messageHeader.setSendTime("153319");

        //table
        List<Table> listTab=new ArrayList<Table>();
        Table table=new Table();
        table.setName("BODY");

        List<Columns> listCol=new ArrayList<Columns>();
        Columns columns1=new Columns();
        columns1.setName("MR_LINE_ID");
        columns1.setCaption("计划行号");
        columns1.setDataType("S");
        listCol.add(columns1);

        Columns columns2=new Columns();
        columns2.setName("ACCOUNT_PERIOD");
        columns2.setCaption("会计期");
        columns2.setDataType("S");
        listCol.add(columns2);

        Columns columns3=new Columns();
        columns3.setName("RETURN_TIME");
        columns3.setCaption("反馈时间");
        columns3.setDataType("S");
        listCol.add(columns3);

        Columns columns4=new Columns();
        columns4.setName("MSG_TYPE");
        columns4.setCaption("消息类型(S:成功 ;E:失败)");
        columns4.setDataType("S");
        listCol.add(columns4);

        Columns columns5=new Columns();
        columns5.setName("MESSAGE");
        columns5.setCaption("消息内容");
        columns5.setDataType("S");
        listCol.add(columns5);

        Columns columns6=new Columns();
        columns6.setName("SYSTEM_ID");
        columns6.setCaption("系统别");
        columns6.setDataType("S");
        listCol.add(columns6);
        table.setListCol(listCol);

        List<Rows> listRow=new ArrayList<Rows>();
        Rows rows=new Rows();
        rows.setMessage("消息接收成功");
        rows.setAccountPeriod("202307");
        rows.setMsgType("S");
        rows.setMrLineId("BJJHGG01230700032-001");
        rows.setReturnTime("20230711153319");
        rows.setSystemId("1012");
        listRow.add(rows);
        table.setListRows(listRow);
        listTab.add(table);

        iXbusPlanInfoBuild.setMessageHeader(messageHeader);
        iXbusPlanInfoBuild.setListTab(listTab);
        return iXbusPlanInfoBuild;
    }
}

在这里插入图片描述

2.5.2字符串转化为对象

TestPut.java

package test;

import entity.*;
import util.JsonUtil;
import util.PurUtil;

import java.util.ArrayList;
import java.util.List;

public class TestPut {
    public static void main(String[] args) {
         String str= PurUtil.readWithFileInputStream("E:/java project/studyEntity1/src/main/resources/plan.json");
         IXbusPlanInfoBuild iXbusPlanInfoBuild=JsonUtil.fromJson(str,IXbusPlanInfoBuild.class);
        int a=1;
    }


    public static IXbusPlanInfoBuild getIXbusPlanInfoBuild(){
        IXbusPlanInfoBuild iXbusPlanInfoBuild=new IXbusPlanInfoBuild();
        MessageHeader messageHeader=new MessageHeader();
        messageHeader.setUuid("8ac4c0b689297e31018943de73433307");
        messageHeader.setSvcName("1012114110");
        messageHeader.setSender("1012");
        messageHeader.setReceiver("1141");
        messageHeader.setMessageId("");
        messageHeader.setMsg("");
        messageHeader.setFlag(0);
        messageHeader.setMessageTypeId("1012114110");
        messageHeader.setSendDate("20230711");
        messageHeader.setSendTime("153319");

        //table
        List<Table> listTab=new ArrayList<Table>();
        Table table=new Table();
        table.setName("BODY");

        List<Columns> listCol=new ArrayList<Columns>();
        Columns columns1=new Columns();
        columns1.setName("MR_LINE_ID");
        columns1.setCaption("计划行号");
        columns1.setDataType("S");
        listCol.add(columns1);

        Columns columns2=new Columns();
        columns2.setName("ACCOUNT_PERIOD");
        columns2.setCaption("会计期");
        columns2.setDataType("S");
        listCol.add(columns2);

        Columns columns3=new Columns();
        columns3.setName("RETURN_TIME");
        columns3.setCaption("反馈时间");
        columns3.setDataType("S");
        listCol.add(columns3);

        Columns columns4=new Columns();
        columns4.setName("MSG_TYPE");
        columns4.setCaption("消息类型(S:成功 ;E:失败)");
        columns4.setDataType("S");
        listCol.add(columns4);

        Columns columns5=new Columns();
        columns5.setName("MESSAGE");
        columns5.setCaption("消息内容");
        columns5.setDataType("S");
        listCol.add(columns5);

        Columns columns6=new Columns();
        columns6.setName("SYSTEM_ID");
        columns6.setCaption("系统别");
        columns6.setDataType("S");
        listCol.add(columns6);
        table.setListCol(listCol);

        List<Rows> listRow=new ArrayList<Rows>();
        Rows rows=new Rows();
        rows.setMessage("消息接收成功");
        rows.setAccountPeriod("202307");
        rows.setMsgType("S");
        rows.setMrLineId("BJJHGG01230700032-001");
        rows.setReturnTime("20230711153319");
        rows.setSystemId("1012");
        listRow.add(rows);
        table.setListRows(listRow);
        listTab.add(table);

        iXbusPlanInfoBuild.setMessageHeader(messageHeader);
        iXbusPlanInfoBuild.setListTab(listTab);
        return iXbusPlanInfoBuild;
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/750733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux 基于debian_ubuntu AB系统适配(三)- overlayroot

Overlayroot Overlayroot是一个实用工具,允许您创建一个只读的根文件系统和一个可写的覆盖文件系统。这对于创建一个更安全和稳定的系统很有用,因为对系统所做的任何更改都将存储在覆盖文件系统中,可以很容易地丢弃或重置。 在Debian下,分离的系统在/userdata/rootfs_ove…

浅谈OS命令注入漏洞(Shell注入漏洞)

一、什么是OS命令注入&#xff1f; 1. 基本概念 OS&#xff08;Operating system&#xff09;命令注入&#xff08;也称为 Shell 注入&#xff09;是一个 Web 安全漏洞&#xff0c;允许攻击者在运行应用程序的服务器上执行任意操作系统 &#xff08;OS&#xff09; 命令&#…

考虑充电负荷空间可调度特性的分布式电源与电动汽车充电站联合配置方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

DaVinci Resolve Studio 18对Mac和Windows系统的要求

DaVinci Resolve Studio 18 是一款功能强大的专业视频编辑和调色软件&#xff0c;它提供了全面的工具和功能&#xff0c;让用户能够完成从剪辑、调色到特效和音频处理等各个方面的任务。DaVinci Resolve Studio 18 在中文界面上进行了优化&#xff0c;使得中文用户能够更加方便…

【xxl-job】分布式任务调度系统xxl-job搭建

XXL-JOB是一个轻量级分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展、开箱即用。 更多介绍&#xff0c;请访问官网&#xff1a;分布式任务调度平台XXL-JOB 一、任务调度中心(基于docker)【Version 2.4.0】 前提条件&#xff1a;任务调度…

Vue3 Vite electron 开发桌面程序

Electron是一个跨平台的桌面应用程序开发框架&#xff0c;它允许开发人员使用Web技术&#xff08;如HTML、CSS和JavaScript&#xff09;构建桌面应用程序&#xff0c;这些应用程序可以在Windows、macOS和Linux等操作系统上运行。 Electron的核心是Chromium浏览器内核和Node.js…

个体化治疗策略:如何使用机器学习定制化药物?

一、引言 个体化治疗策略是一种基于患者个体特征和病情的定制化治疗方法&#xff0c;旨在提高治疗效果、减少药物副作用并优化患者的生命质量。传统的治疗方法往往采用标准化的治疗方案&#xff0c;忽视了个体差异和患者特定的需求。然而&#xff0c;每个患者的基因组、疾病特征…

JAVA——二维数组遍历二维数组的三种方法

目录 &#x1f352;java中二维数组的定义和赋值 &#x1f352;二维数组遍历的三种方法 &#x1f347;第一种&#xff1a;for循环遍历 &#x1f347;第二种方法&#xff1a;通过Arrays.deepToString()遍历 &#x1f347;第三种方法&#xff1a;通过for&#xff08; : &a…

七大排序算法——希尔排序,通俗易懂的思路讲解与图解(完整Java代码)

文章目录 一、排序的概念排序的概念排序的稳定性七大排序算法 二、希尔排序核心思想代码实现 三、性能分析四、七大排序算法性能对比 一、排序的概念 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0…

自动化测试与持续集成方案

目录 前言&#xff1a; 传统接口测试 接口测试自动化 接口自动化的持续集成 前言&#xff1a; 自动化测试和持续集成是软件开发过程中非常重要的环节。自动化测试可以提高测试效率和准确性&#xff0c;而持续集成则可以确保代码的稳定性和可靠性。 传统接口测试 不知道别…

使用WiFi测量仪进行机器人定位的粒子过滤器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

50. Pow(x, n) 快速幂

题目链接&#xff1a;力扣 解题思路&#xff1a;直接使用for进行累乘会超时&#xff08;时间复杂度O(n)&#xff0c;n为指数n的大小&#xff09;&#xff0c;可以使用快速幂进行更快的幂运算(时间复杂度为O(logn)) 快速幂&#xff1a;核心思想就是每一次把指数缩小一半&#x…

华南农业大学|图像处理与分析技术综合设计|题目解答:读取电表示数

l 设计任务&#xff1a; ipa05.jpg是一幅电气柜上的电表图像&#xff0c;试采用图像处理与分析技术&#xff0c;设计适当的 算法和程序&#xff0c;找出电流表所在的区域&#xff0c;提取其指针位置&#xff0c;计算指针与表盘下沿 的夹角&#xff0c;进而判断当前电表的读数…

车载软件架构——车载诊断软件框架

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 人们会在生活中不断攻击你。他们的主要武器是向你灌输对自己的怀疑&#xff1a;你的价值、你的能力、你的…

vue2+AntdesignVue a-input使用颜色选择器

不需要任何插件即可实现颜色选择器 a-input type设置为color即可 回调函数

vue进阶-消息的订阅与发布

&#x1f4d6;vue基础学习-组件 介绍了嵌套组件间父子组件通过 props 属性进行传参。子组件传递数据给父组件通过 $emit() 返回自定义事件&#xff0c;父组件调用自定义事件接收子组件返回参数。 &#x1f4d6;vue进阶-vue-route 介绍了路由组件传参&#xff0c;两种方式&…

Spring MVC异步上传、跨服务器上传和文件下载

一、异步上传 之前的上传方案&#xff0c;在上传成功后都会跳转页面。而在实际开发中&#xff0c;很多情况下上传后不进行跳转&#xff0c;而是进行页面的局部刷新&#xff0c;比如&#xff1a;上传头像成功后将头像显示在网页中。这时候就需要使用异步文件上传。 1.1 JSP页面 …

PT:report_timing实用技巧

report_timing -start_end_pair 默认report_timing -to 会报告到endpoint最差一条violation path。 用report_timing -max_path X就会报告到endpoint的X条path&#xff0c;每组startpoint /endpoint只报告最差的一条(在X范围内有多少报多少&#xff0c;下面同理)。 用report…

Android 生成pdf文件

Android 生成pdf文件 1.使用官方的方式 使用官方的方式也就是PdfDocument类的使用 1.1 基本使用 /**** 将tv内容写入到pdf文件*/RequiresApi(api Build.VERSION_CODES.KITKAT)private void newPdf() {// 创建一个PDF文本对象PdfDocument document new PdfDocument();//创建…

什么是从人类反馈中强化学习(RLHF)?

自从OpenAI公司发布ChatGPT以来&#xff0c;人们对大型语言模型(LLM)的这一重大进步感到兴奋。虽然ChatGPT与其他最先进的大型语言模型大小相同&#xff0c;但其性能要高得多&#xff0c;并且承诺支持新的应用程序或颠覆取代原有的应用程序。 ChatGPT的惊人表现背后的主要原因…