`
zzc1684
  • 浏览: 1241177 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Jackson 框架,轻易转换JSON

阅读更多

Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。

前面有介绍过json-lib这个框架,在线博文:http://www.cnblogs.com/hoojo/archive/2011/04/21/2023805.html

相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。而且Jackson社区相对比较活跃,更新速度也比较快。

一、准备工作

1、 下载依赖库jar包

Jackson的jar all下载地址:http://jackson.codehaus.org/1.7.6/jackson-all-1.7.6.jar

然后在工程中导入这个jar包即可开始工作

官方示例:http://wiki.fasterxml.com/JacksonInFiveMinutes

因为下面的程序是用junit测试用例运行的,所以还得添加junit的jar包。版本是junit-4.2.8

如果你需要转换xml,那么还需要stax2-api.jar

2、 测试类基本代码如下

package com.hoo.test;
 
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.codehaus.jackson.JsonEncoding;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.node.JsonNodeFactory;
import org.codehaus.jackson.xml.XmlMapper;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.hoo.entity.AccountBean;
 
/**
 * <b>function:</b>Jackson 将java对象转换成JSON字符串,也可以将JSON字符串转换成java对象
 * jar-lib-version: jackson-all-1.6.2
 * jettison-1.0.1
 * @author hoojo
 * @createDate 2010-11-23 下午04:54:53
 * @file JacksonTest.java
 * @package com.hoo.test
 * @project Spring3
 * @blog http://blog.csdn.net/IBM_hoojo
 * @email hoojo_@126.com
 * @version 1.0
 */
@SuppressWarnings("unchecked")
public class JacksonTest {
    private JsonGenerator jsonGenerator = null;
    private ObjectMapper objectMapper = null;
    private AccountBean bean = null;
    
    @Before
    public void init() {
        bean = new AccountBean();
        bean.setAddress("china-Guangzhou");
        bean.setEmail("hoojo_@126.com");
        bean.setId(1);
        bean.setName("hoojo");
        
        objectMapper = new ObjectMapper();
        try {
            jsonGenerator = objectMapper.getJsonFactory()
                           .createJsonGenerator(System.out, JsonEncoding.UTF8);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    @After
    public void destory() {
        try {
            if (jsonGenerator != null) {
                jsonGenerator.flush();
            }
            if (!jsonGenerator.isClosed()) {
                jsonGenerator.close();
            }
            jsonGenerator = null;
            objectMapper = null;
            bean = null;
            System.gc();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3、 所需要的JavaEntity

package com.hoo.entity;
 
public class AccountBean {
    private int id;
    private String name;
    private String email;
    private String address;
    private Birthday birthday;
    
    //getter、setter
    
    @Override
    public String toString() {
        return this.name + "#" + this.id + "#" + this.address + "#" + this.birthday + "#" + this.email;
    }
}

Birthday

package com.hoo.entity;
 
public class Birthday {
    private String birthday;
    
    public Birthday(String birthday) {
        super();
        this.birthday = birthday;
    }
 
    //getter、setter
 
    public Birthday() {}
    
    @Override
    public String toString() {
        return this.birthday;
    }
}

二、Java对象转换成JSON

1、 JavaBean(Entity/Model)转换成JSON

/**
 * <b>function:</b>将java对象转换成json字符串
 * @author hoojo
 * @createDate 2010-11-23 下午06:01:10
 */
@Test
public void writeEntityJSON() {
    
    try {
        System.out.println("jsonGenerator");
        //writeObject可以转换java对象,eg:JavaBean/Map/List/Array等
        jsonGenerator.writeObject(bean);    
        System.out.println();
        
        System.out.println("ObjectMapper");
        //writeValue具有和writeObject相同的功能
        objectMapper.writeValue(System.out, bean);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

运行后结果如下:

jsonGenerator
{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"}
ObjectMapper
{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"}

上面分别利用JsonGenerator的writeObject方法和ObjectMapper的writeValue方法完成对Java对象的 转换,二者传递的参数及构造的方式不同;JsonGenerator的创建依赖于ObjectMapper对象。也就是说如果你要使用 JsonGenerator来转换JSON,那么你必须创建一个ObjectMapper。但是你用ObjectMapper来转换JSON,则不需要 JSONGenerator。

objectMapper的writeValue方法可以将一个Java对象转换成JSON。这个方法的参数一,需要提供一个输出流,转换后可以通 过这个流来输出转换后的内容。或是提供一个File,将转换后的内容写入到File中。当然,这个参数也可以接收一个JSONGenerator,然后通 过JSONGenerator来输出转换后的信息。第二个参数是将要被转换的Java对象。如果用三个参数的方法,那么是一个Config。这个 config可以提供一些转换时的规则,过指定的Java对象的某些属性进行过滤或转换等。

2、 将Map集合转换成Json字符串

/**
 * <b>function:</b>将map转换成json字符串
 * @author hoojo
 * @createDate 2010-11-23 下午06:05:26
 */
@Test
public void writeMapJSON() {
    try {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("name", bean.getName());
        map.put("account", bean);
        bean = new AccountBean();
        bean.setAddress("china-Beijin");
        bean.setEmail("hoojo@qq.com");
        map.put("account2", bean);
        
        System.out.println("jsonGenerator");
        jsonGenerator.writeObject(map);
        System.out.println("");
        
        System.out.println("objectMapper");
        objectMapper.writeValue(System.out, map);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

转换后结果如下:

jsonGenerator
{"account2":{"address":"china-Beijin","name":null,"id":0,"birthday":null,"email":"hoojo@qq.com"},

"name":"hoojo",
"account":{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,

"email":"hoojo_@126.com"}}
objectMapper
{"account2":{"address":"china-Beijin","name":null,"id":0,"birthday":null,"email":"hoojo@qq.com"},

"name":"hoojo",
"account":{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,

"email":"hoojo_@126.com"}}

3、 将List集合转换成json

/**
 * <b>function:</b>将list集合转换成json字符串
 * @author hoojo
 * @createDate 2010-11-23 下午06:05:59
 */
@Test
public void writeListJSON() {
    try {
        List<AccountBean> list = new ArrayList<AccountBean>();
        list.add(bean);
        
        bean = new AccountBean();
        bean.setId(2);
        bean.setAddress("address2");
        bean.setEmail("email2");
        bean.setName("haha2");
        list.add(bean);
        
        System.out.println("jsonGenerator");
        //list转换成JSON字符串
        jsonGenerator.writeObject(list);
        System.out.println();
        System.out.println("ObjectMapper");
        //用objectMapper直接返回list转换成的JSON字符串
        System.out.println("1###" + objectMapper.writeValueAsString(list));
        System.out.print("2###");
        //objectMapper list转换成JSON字符串
        objectMapper.writeValue(System.out, list);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

结果如下:

jsonGenerator
[{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"},
{"address":"address2","name":"haha2","id":2,"birthday":null,"email":"email2"}]
ObjectMapper
1###[{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"},
{"address":"address2","name":"haha2","id":2,"birthday":null,"email":"email2"}]
2###[{"address":"china-Guangzhou","name":"hoojo","id":1,"birthday":null,"email":"hoojo_@126.com"},
{"address":"address2","name":"haha2","id":2,"birthday":null,"email":"email2"}]

外面就是多了个[]中括号;同样Array也可以转换,转换的JSON和上面的结果是一样的,这里就不再转换了。~.~

4、下面来看看jackson提供的一些类型,用这些类型完成json转换;如果你使用这些类型转换JSON的话,那么你即使没有 JavaBean(Entity)也可以完成复杂的Java类型的JSON转换。下面用到这些类型构建一个复杂的Java对象,并完成JSON转换。

@Test
public void writeOthersJSON() {
    try {
        String[] arr = { "a", "b", "c" };
        System.out.println("jsonGenerator");
        String str = "hello world jackson!";
        //byte
        jsonGenerator.writeBinary(str.getBytes());
        //boolean
        jsonGenerator.writeBoolean(true);
        //null
        jsonGenerator.writeNull();
        //float
        jsonGenerator.writeNumber(2.2f);
        //char
        jsonGenerator.writeRaw("c");
        //String
        jsonGenerator.writeRaw(str, 5, 10);
        //String
        jsonGenerator.writeRawValue(str, 5, 5);
        //String
        jsonGenerator.writeString(str);
        jsonGenerator.writeTree(JsonNodeFactory.instance.POJONode(str));
        System.out.println();
        
        //Object
        jsonGenerator.writeStartObject();//{
        jsonGenerator.writeObjectFieldStart("user");//user:{
        jsonGenerator.writeStringField("name", "jackson");//name:jackson
        jsonGenerator.writeBooleanField("sex", true);//sex:true
        jsonGenerator.writeNumberField("age", 22);//age:22
        jsonGenerator.writeEndObject();//}
        
        jsonGenerator.writeArrayFieldStart("infos");//infos:[
        jsonGenerator.writeNumber(22);//22
        jsonGenerator.writeString("this is array");//this is array
        jsonGenerator.writeEndArray();//]
        
        jsonGenerator.writeEndObject();//}
        
        
        AccountBean bean = new AccountBean();
        bean.setAddress("address");
        bean.setEmail("email");
        bean.setId(1);
        bean.setName("haha");
        //complex Object
        jsonGenerator.writeStartObject();//{
        jsonGenerator.writeObjectField("user", bean);//user:{bean}
        jsonGenerator.writeObjectField("infos", arr);//infos:[array]
        jsonGenerator.writeEndObject();//}
        
    } catch (Exception e) {
        e.printStackTrace();
    }
}

运行后,结果如下:

jsonGenerator
"aGVsbG8gd29ybGQgamFja3NvbiE=" true null 2.2c world jac  worl "hello world jackson!" "hello world jackson!"
 {"user":{"name":"jackson","sex":true,"age":22},"infos":[22,"this is array"]} 
{"user":{"address":"address","name":"haha","id":1,"birthday":null,"email":"email"},"infos":["a","b","c"]}

怎么样?构造的json字符串和输出的结果是一致的吧。关键看懂用JSONGenerator提供的方法,完成一个Object的构建。

三、JSON转换成Java对象

1、 将json字符串转换成JavaBean对象

@Test
public void readJson2Entity() {
    String json = "{\"address\":\"address\",\"name\":\"haha\",\"id\":1,\"email\":\"email\"}";
    try {
        AccountBean acc = objectMapper.readValue(json, AccountBean.class);
        System.out.println(acc.getName());
        System.out.println(acc);
    } catch (JsonParseException e) {
        e.printStackTrace();
    } catch (JsonMappingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

很简单,用到了ObjectMapper这个对象的readValue这个方法,这个方法需要提供2个参数。第一个参数就是解析的JSON字符串, 第二个参数是即将将这个JSON解析吃什么Java对象,Java对象的类型。当然,还有其他相同签名方法,如果你有兴趣可以一一尝试使用方法,当然使用 的方法和当前使用的方法大同小异。运行后,结果如下:

haha
haha#1#address#null#email

2、 将json字符串转换成List<Map>集合

/**
 * <b>function:</b>json字符串转换成list<map>
 * @author hoojo
 * @createDate 2010-11-23 下午06:12:01
 */
@Test
public void readJson2List() {
    String json = "[{\"address\": \"address2\",\"name\":\"haha2\",\"id\":2,\"email\":\"email2\"},"+
                "{\"address\":\"address\",\"name\":\"haha\",\"id\":1,\"email\":\"email\"}]";
    try {
        List<LinkedHashMap<String, Object>> list = objectMapper.readValue(json, List.class);
        System.out.println(list.size());
        for (int i = 0; i < list.size(); i++) {
            Map<String, Object> map = list.get(i);
            Set<String> set = map.keySet();
            for (Iterator<String> it = set.iterator();it.hasNext();) {
                String key = it.next();
                System.out.println(key + ":" + map.get(key));
            }
        }
    } catch (JsonParseException e) {
        e.printStackTrace();
    } catch (JsonMappingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

尝试过将上面的JSON转换成List,然后List中存放AccountBean,但结果失败了。但是支持Map集合。因为你转成List.class,但是不知道List存放何种类型。只好默然Map类型。因为所有的对象都可以转换成Map结合,运行后结果如下:

2
address:address2
name:haha2
id:2
email:email2
address:address
name:haha
id:1
email:email

3、 Json字符串转换成Array数组,由于上面的泛型转换不能识别到集合中的对象类型。所有这里用对象数组,可以解决这个问题。只不过它不再是集合,而是一个数组。当然这个不重要,你可以用Arrays.asList将其转换成List即可。

/**
 * <b>function:</b>json字符串转换成Array
 * @author hoojo
 * @createDate 2010-11-23 下午06:14:01
 */
@Test
public void readJson2Array() {
    String json = "[{\"address\": \"address2\",\"name\":\"haha2\",\"id\":2,\"email\":\"email2\"},"+
            "{\"address\":\"address\",\"name\":\"haha\",\"id\":1,\"email\":\"email\"}]";
    try {
        AccountBean[] arr = objectMapper.readValue(json, AccountBean[].class);
        System.out.println(arr.length);
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        
    } catch (JsonParseException e) {
        e.printStackTrace();
    } catch (JsonMappingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

运行后的结果:

2
haha2#2#address2#null#email2
haha#1#address#null#email

4、 Json字符串转换成Map集合

/**
 * <b>function:</b>json字符串转换Map集合
 * @author hoojo
 * @createDate Nov 27, 2010 3:00:06 PM
 */
@Test
public void readJson2Map() {
    String json = "{\"success\":true,\"A\":{\"address\": \"address2\",
\"name\":\"haha2\",\"id\":2,\"email\":\"email2\"},"+
                "\"B\":{\"address\":\"address\",\"name\":\"haha\",\"id\":1,\"email\":\"email\"}}";
    try {
        Map<String, Map<String, Object>> maps = objectMapper.readValue(json, Map.class);
        System.out.println(maps.size());
        Set<String> key = maps.keySet();
        Iterator<String> iter = key.iterator();
        while (iter.hasNext()) {
            String field = iter.next();
            System.out.println(field + ":" + maps.get(field));
        }
    } catch (JsonParseException e) {
        e.printStackTrace();
    } catch (JsonMappingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

运行后结果如下:

3
success:true
A:{address=address2, name=haha2, id=2, email=email2}
B:{address=address, name=haha, id=1, email=email}

四、JacksonXML的支持

Jackson也可以完成java对象到xml的转换,转换后的结果要比json-lib更直观,不过它依赖于stax2-api.jar这个jar包。

/**
 * <b>function:</b>java对象转换成xml文档
 * 需要额外的jar包 stax2-api.jar
 * @author hoojo
 * @createDate 2010-11-23 下午06:11:21
 */
@Test
public void writeObject2Xml() {
    //stax2-api-3.0.2.jar
    System.out.println("XmlMapper");
    XmlMapper xml = new XmlMapper();
    
    try {
        //javaBean转换成xml
        //xml.writeValue(System.out, bean);
        StringWriter sw = new StringWriter();
        xml.writeValue(sw, bean);
        System.out.println(sw.toString());
        //List转换成xml
        List<AccountBean> list = new ArrayList<AccountBean>();
        list.add(bean);
        list.add(bean);
        System.out.println(xml.writeValueAsString(list));
        
        //Map转换xml文档
        Map<String, AccountBean> map = new HashMap<String, AccountBean>();
        map.put("A", bean);
        map.put("B", bean);
        System.out.println(xml.writeValueAsString(map));
    } catch (JsonGenerationException e) {
        e.printStackTrace();
    } catch (JsonMappingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

运行上面的方法,结果如下:

XmlMapper
<unknown><address>china-Guangzhou</address><name>hoojo</name><id>1</id><birthday/>
<email>hoojo_@126.com</email></unknown>
<unknown><unknown><address>china-Guangzhou</address><name>hoojo</name><id>1</id>
<birthday/><email>hoojo_@126.com</email></unknown>
<email><address>china-Guangzhou</address><name>hoojo</name><id>1</id><birthday/>
<email>hoojo_@126.com</email></email></unknown>
<unknown><A><address>china-Guangzhou</address><name>hoojo</name><id>1</id>
<birthday/><email>hoojo_@126.com</email></A>
<B><address>china-Guangzhou</address><name>hoojo</name><id>1</id><birthday/>
<email>hoojo_@126.com</email></B></unknown>

看结果,根节点都是unknown 这个问题还没有解决,由于根节点没有转换出来,所有导致解析xml到Java对象,也无法完成。

分享到:
评论

相关推荐

    大语言模型生成控制参数详解:温度、Top-K与Top-P.md

    大语言模型生成控制参数详解:温度、Top-K与Top-P.md

    肿瘤微环境细胞检测数据集2.zip

    数据集介绍:肿瘤微环境细胞检测数据集 数据集名称:肿瘤微环境细胞检测数据集 图片规模: - 训练集:2,631张医学图像 - 验证集:251张医学图像 - 测试集:125张医学图像 细胞类别: - Fibroblast(成纤维细胞):肿瘤微环境中的基质细胞,参与肿瘤生长与转移过程 - Lymphocyte(淋巴细胞):免疫系统重要组成,反映肿瘤免疫微环境特征 - Tumor(肿瘤细胞):恶性肿瘤组织中的异常增殖细胞 标注体系: - YOLO格式标注,包含细胞位置与类别信息 - 医学影像来源于组织病理切片,包含多部位癌症样本 AI病理诊断系统开发: 支持构建癌症组织病理分析模型,实现肿瘤细胞与微环境成分的精准识别,辅助病理科医生提升诊断效率 肿瘤免疫治疗研究: 通过淋巴细胞分布密度分析,为免疫治疗响应预测模型提供关键数据支撑 医学影像算法研究: 适用于细胞级目标检测、微环境成分定量分析等计算机视觉任务,支持多目标跟踪等算法开发 数字病理教学系统: 可作为医学教育机构的教学素材,用于肿瘤微环境认知教学和病理检测AI模型训练 临床价值突出: 完整覆盖肿瘤微环境三大关键组分,包含癌变组织、免疫细胞和基质细胞,支持肿瘤演进机制研究 标注专业精准: 由病理专家参与标注验证,确保肿瘤细胞边界标注准确,支持高精度细胞定位需求 数据多样性丰富: 包含不同分化程度的肿瘤细胞样本,涵盖多种组织切片制备工艺的成像特征 工程适配性强: YOLO格式可直接适配主流检测框架,支持快速开展肿瘤检测模型训练与效果验证

    基于EKF的三架无人机协同定位移动目标的仿真分析

    内容概要:本文详细介绍了利用扩展卡尔曼滤波器(EKF)进行三架无人机协同定位移动目标的仿真研究。首先,建立了大地坐标系并定义了目标的状态向量为位置和速度[x, y, z, vx, vy, vz]。然后,构建了无人机的量测模型,通过被动雷达导引头获取目标的高低角和方位角。接着,设计了EKF的核心部分,包括状态转移矩阵F、观测矩阵H及其雅可比矩阵的计算。仿真过程中设置了蛇形机动轨迹的目标,并讨论了多无人机观测数据的时间对齐处理。结果显示,三机协同定位显著提高了定位精度,特别是在Z轴方向,均方根误差由单机的12米降低到5米以内。此外,还探讨了观测几何对定位精度的影响以及初始协方差矩阵P0的正确设置。 适合人群:从事无人机导航、定位算法研究的专业人士,以及对EKF有一定了解的研究人员。 使用场景及目标:适用于需要提高无人机编队对移动目标定位精度的应用场合,旨在通过优化EKF算法实现更精确的目标追踪。 其他说明:文中提供了详细的数学模型和代码片段,有助于读者深入理解EKF的工作原理及其实现细节。同时指出了一些常见的陷阱,如初始协方差矩阵不能设为全零等。

    PYTHON脚本,音频播放,截取,合并软件

    PYTHON脚本,音频播放,截取,合并软件。

    基于springboot+vue的汽车租赁管理系统(源码+数据库)166

    基于springboot+vue的汽车租赁管理系统:前端 vue、elementui,后端 maven、springmvc、spring、mybatis;角色分为管理员、用户;集成汽车信息浏览,在线租赁,还车等功能于一体的系统。 ## 功能介绍 ### 用户 - 基本操作:登录、注册、修改个人信息、查看基本资料 - 车辆信息模块:获取车辆列表、筛选车辆、查看车辆信息详情、点赞、拉踩、评论车辆、租赁、收藏车辆 - 系统公告模块:获取系统公告列表、查看系统公告详情 - 其他操作:获取轮播图列表、查看收藏列表 ### 管理员 - 基本操作:登录、修改密码、获取个人信息 - 用户管理:新增用户、获取用户列表、筛选用户信息、查看用户信息详情、修改用户信息、删除用户 - 车辆品牌管理:新增品牌、筛选品牌、修改品牌信息、删除品牌 - 车辆信息管理:筛选车辆、获取车辆信息列表、查看车辆信息详情、修改车辆信息、删除车辆信息、查看车辆评论 - 车辆颜色管理:筛选车辆颜色、新增车辆颜色、修改车辆颜色、删除车辆颜色 - 租赁订单管理:筛选订单、删除订单、审核租赁请求、修改订单信息、查看订单信息详情 - 还车信息管理:筛选还车信息、上传还车信息、查看还车信息详情、修改还车信息、删除还车信息 - 管理员管理:新增管理员、搜索管理员、查看管理员信息详情、修改管理员信息、删除管理员 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Node 14.14.0</b> - <b>JDK 1.8</b>

    基于springboot+vue的网上鲜花交易管理系统(源码+数据库)177

    基于springboot+vue的网上鲜花交易管理系统:前端 vue、elementui,后端 maven、springmvc、spring、mybatis;角色分为管理员,用户;集成商家,鲜花浏览,购物车等功能于一体的系统。 ## 功能介绍 ### 用户 - 基本功能:登录,注册,退出 - 网站首页:主导航栏,轮播图,鲜花游览推荐,商家展示 - 商家:商家列表展示,按店铺名和店铺地址模糊搜索,商家详情,评论 - 鲜花:鲜花列表展示,按名称、用途、花语、店铺名模糊搜索,鲜花详情,购物车,在线结算 - 其他功能:系统公告,在线客服,鲜花结束 - 个人中心:个人信息查看与修改,我的订单查询,我的修改维护,我的收藏列表 ### 管理员 - 用户管理:用户信息的增删改查,用户也可以在前台自行注册 - 商家管理:商家信息的增删改查,查看商家评论,评论回复,评论删除 - 鲜花分类管理:分类信息的增删改查 - 鲜花管理:鲜花信息的增删改查,图片上传,查看评论,评论回复,评论删除 - 系统管理:系统公告管理,在线客服,轮播图管理 - 订单管理:用户下单后,管理员查看用户订单,发货操作 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Tomcat 7.0.73</b> - <b>Node 14.14.0</b> - <b>JDK 1.8</b>

    基于springboot+vue的商城管理系统(源码+数据库)220

    基于springboot+vue的商城管理系统:前端 vue2、elementui,后端 maven、springmvc、spring、mybatis;角色分为管理员、用户;集成商品浏览、购物车、在线下单、订单查询等功能于一体的系统。 ## 功能介绍 ### 用户 - 基本功能:登录,注册,退出 - 网站首页:主导航栏,轮播图,商品搜索,推荐商品,热门商品 - 商品购买:商品列表浏览,商品详情,立即购买,加入购物车,收藏,在线付款(模拟) - 我的订单:订单列表查询,订单删除 - 其它功能:我的收藏,我的地址,在线客服 ### 管理员 - 商品分类管理:分类信息的增删改查,体育商品分类、衣服商品分类、鞋子商品分类、手机商品分类、电脑商品分类 - 用户管理:用户信息的增删改查,密码修改 - 订单管理:管理员查询用户的下单数据,按订单号查询订单 - 数据统计:折线统计,柱形统计,用户分布图 - 在线客服:查看用户的留言数据,回复操作 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Node 14.14.0</b> - <b>JDK 1.8</b>

    dac0d-main.zip

    dac0d-main.zip

    4轴码垛机械臂DIY指南:从硬件组装到智能控制的全面解析

    内容概要:本文详细介绍了4轴码垛机械臂的DIY过程,涵盖了从硬件组装到软件编程的各个步骤。首先,作者展示了如何利用提供的STEP模型文件和STL 3D打印文件进行机械臂的三维建模和实物组装,解释了四轴导轨结构及其控制原理。接着,深入探讨了固件和上位机软件的作用,包括固件的控制逻辑、调试方法以及上位机软件的使用方式。此外,还介绍了如何通过语音控制和图像处理技术扩展机械臂的功能,如实现语音指令响应和物体识别抓取。最后,总结了该项目的学习价值和潜在应用。 适合人群:对机器人技术和自动化感兴趣的DIY爱好者、学生和技术人员。 使用场景及目标:① 学习机械臂的基本构造和工作原理;② 掌握机械臂的硬件组装技巧;③ 编程实现机械臂的基本控制功能;④ 实现高级功能如语音控制和图像处理。 其他说明:文中提供了丰富的代码示例和实用技巧,帮助读者更好地理解和实践。无论是初学者还是有一定经验的技术人员都能从中受益。

    ### 南京邮电大学考研资料汇总:高分笔记与真题解析

    内容概要:本文档是针对南京邮电大学数学实验的资料汇总,主要分为高分笔记(讲义)和真题资料两大部分。高分笔记由上岸学长学姐结合自身经验、真题、考纲及教材精心编制,旨在帮助考生快速掌握核心重难点。笔记内容包括上岸经验分享、考点总结、推荐教材例题习题和思维导图。真题资料汇集了该校自2007年至2024年的历年硕士研究生入学考试初试试题及其参考答案,通过反复练习真题,考生可以更好地把握考试方向。此外,文档还提供了综合评价考试的面试模式和备考建议,包括面试流程、考核安排、常见问题及应对策略。 适合人群:准备报考南京邮电大学硕士研究生入学考试的考生,尤其是对通信、计算机等专业感兴趣的学生。 使用场景及目标:①帮助考生在备考期间高效复习,明确考试重点和难点;②通过真题练习加深对知识点的理解,熟悉考试题型;③为参加综合评价考试提供详细的面试指导,增强应试信心。 其他说明:文档不仅提供了丰富的理论知识和实践经验,还特别强调了复习方法的重要性,如合理规划复习时间、选择合适的复习资料等。同时,对于面试部分,文档给出了具体的面试流程和注意事项,有助于考生提前做好心理和技术准备。

    直流电机双闭环调速系统仿真建模及参数整定详解

    内容概要:本文详细介绍了直流电机双闭环调速系统的仿真建模及其参数整定方法。首先解释了双闭环的基本概念,即电流环作为内环,转速环作为外环,确保电机转速稳定且无明显波动。文中通过具体的公式推导和MATLAB/Simulink代码展示了电流环和转速环的比例积分(PI)控制器参数计算过程,强调了电流环响应速度快于转速环的重要性。同时,针对转速环引入了微分负反馈机制,有效抑制了超调现象。此外,文章还提供了多个实用技巧,如电流环和转速环的滤波时间设置、抗积分饱和处理以及仿真步长的选择,确保仿真的精确性和稳定性。 适用人群:适用于对直流电机控制系统有一定了解并希望深入掌握双闭环调速系统仿真建模的技术人员和研究人员。 使用场景及目标:①帮助读者理解双闭环调速系统的原理和参数整定方法;②指导读者在Simulink中搭建仿真模型并进行参数优化;③提供实际应用中的注意事项和技术难点解析,提高仿真实验的成功率。 其他说明:文章不仅提供了详细的理论推导和代码实现,还分享了许多实践经验,如参数选择的经验法则、常见错误规避等,使读者能够更好地理解和应用所学知识。

    【Robotics-TOOLBOX(机器人工具箱)源代码】RPP正逆运动学计算实例

    RPP正逆运动学计算实例

    基于ThinkPHP5.0.10制作零食商城,三端分离,前后端完全分离.zip

    基于ThinkPHP5.0.10制作零食商城,三端分离,前后端完全分离

    【无人机表演路径规划】基于Python的数学建模与3D可视化:无人机阵列螺旋运动及水面涟漪效果模拟

    内容概要:本文档介绍了一段基于 Python 的无人机表演路径生成代码,主要用于数学建模和路径规划的模拟。代码中定义了两个主要类:`DragonBallPath`用于生成无人机的螺旋运动轨迹、模拟水面涟漪效果并更新无人机的位置;`AnimationController`负责3D动态可视化的创建、视角设置以及动画的启动。通过参数方程、正弦函数和随机噪声分别实现了路径生成、波动效果和真实感增强。此外,代码考虑了性能优化,如减少显示数量以保证流畅性和使用高效可视化方法。还具有良好的扩展性,允许用户调整基础参数来自定义运动效果。 适合人群:对无人机编队飞行感兴趣的研究人员、开发者或爱好者,尤其是有一定 Python 编程基础和技术背景的人士。 使用场景及目标:①作为研究或教学工具,帮助理解无人机编队飞行的路径规划和数学建模;②为实际的无人机编队飞行表演提供理论依据和技术参考;③探索不同参数设置下无人机编队的表现形式。 其他说明:此代码仅为模拟用途,在实际部署时还需要无人机硬件控制接口、精确的坐标校准系统、实时通信协议和安全防护机制。建议在支持3D渲染的Python环境中运行,如Jupyter Notebook,并确保安装了必要的库(numpy、matplotlib)。

    2kW双向储能变换器PFCLLC结构的整流逆变模式切换与优化

    内容概要:本文详细介绍了基于PFCLLC结构的2kW双向储能变换器的设计与优化。首先探讨了整流模式下,单相PWM整流器和LLC谐振变换器的工作原理及其关键参数配置,强调了死区时间和谐振频率对系统性能的影响。接着讨论了逆变模式下,LLC作为升压逆变器的操作方法,特别关注了同步整流时序和模式切换的无缝衔接。文中提供了大量代码片段,展示了具体的实现细节和技术难点。此外,还分享了多个工程实践经验,如母线电容的选择、硬件缓启电路的重要性以及仿真与实测之间的差异处理。 适合人群:从事电力电子、新能源项目开发的技术人员,尤其是有一定嵌入式开发经验和电源设计背景的研发人员。 使用场景及目标:适用于需要高效双向能量转换的应用场合,如光伏储能系统、工业电源等。主要目标是提高系统的效率、可靠性和稳定性,同时减少波形失真和电磁干扰。 其他说明:文章不仅涵盖了理论分析,还包括大量的实际应用案例和调试技巧,有助于读者更好地理解和掌握双向储能变换器的设计与优化方法。

    CST与FDTD中贝塞尔光束仿真的全流程详解:从相位计算到光场分析

    内容概要:本文详细介绍了如何在CST和FDTD中进行贝塞尔光束的仿真。首先,通过MATLAB计算贝塞尔光束所需的相位分布,确保相位参数符合贝塞尔函数的零点条件。接着,在CST中建立模型,设置合适的边界条件和场源,导入相位数据并运行仿真。仿真完成后,利用Python对电场数据进行后处理,生成光强分布图。同时,文中还讨论了FDTD仿真中的注意事项,如网格尺寸和边界条件的选择。最后,通过对比CST和FDTD的仿真结果,探讨了两者的差异及其应用场景。 适合人群:从事光学仿真、光束控制以及相关科研工作的研究人员和技术人员。 使用场景及目标:①掌握贝塞尔光束的相位计算方法;②熟悉CST和FDTD中贝塞尔光束仿真的具体步骤;③理解两种仿真工具之间的差异及各自的优缺点。 其他说明:本文不仅提供了详细的仿真流程指导,还分享了许多实用的避坑技巧,帮助读者更好地理解和应用贝塞尔光束仿真技术。

    SpringBoot在线拍卖竞价拍卖竞拍系统源码+详细讲解视频教程+论文+软件环境+包远程安装配置.zip

    SpringBoot在线拍卖竞价拍卖竞拍系统源码+详细讲解视频教程+论文+软件环境+包远程安装配置

    COMSOL光学仿真中液晶分子与超表面联合调制相位的张量矩阵设置研究

    内容概要:本文详细介绍了如何在COMSOL中通过张量矩阵设置液晶分子(如向列相和胆甾相液晶)与超表面的联合调制相位。首先阐述了液晶分子和超表面的基本理论背景,然后具体讲解了在COMSOL中如何设置张量矩阵来描述液晶的介电特性及其空间分布,特别是针对不同类型的液晶分子(如向列相和胆甾相)。此外,还探讨了如何将液晶分子的各向异性特性与超表面微结构耦合,以实现复杂的相位调制效果。文中提供了具体的MATLAB代码片段用于定义介电张量和指向矢场,并讨论了仿真过程中需要注意的问题,如边界条件耦合和材料参数的动态调整。 适合人群:从事光学仿真、液晶材料研究以及超表面设计的研究人员和技术人员。 使用场景及目标:适用于希望深入了解液晶分子与超表面联合调制相位机制的研究者,旨在帮助他们掌握在COMSOL中实现这一过程的具体方法和技术细节,以便应用于实际项目,如可调谐透镜和AR/VR设备的设计。 其他说明:文中不仅提供了详细的理论解释和技术指导,还包括了一些实用的操作技巧和常见问题的解决方案,有助于提高仿真的成功率和效率。

    蓝色美人鱼儿童教学课件模板.pptx

    蓝色美人鱼儿童教学课件模板

    FLAC3D 6.0隧道开挖与联合支护建模实例解析

    内容概要:本文详细介绍了利用FLAC3D 6.0进行隧道开挖及联合支护的数值模拟方法。从基础网格生成开始,逐步讲解了材料属性设置、边界条件施加、分步开挖策略、喷浆支护、锚杆及锚索布置等关键技术环节。特别强调了新版本特有的功能如自动回退机制、预应力动态调整以及常见错误防范措施。通过具体案例展示了如何优化支护参数以提高模型稳定性,并提供了完整的代码示例供读者参考。 适合人群:从事岩土工程、地下结构设计的研究人员和技术人员,尤其适用于有一定FLAC3D使用经验并希望深入掌握高级应用技巧的专业人士。 使用场景及目标:帮助用户理解和掌握FLAC3D 6.0在隧道工程中的应用,特别是在复杂地质条件下实施高效可靠的数值模拟。通过学习本文提供的实例,能够更好地规划和执行隧道开挖项目,确保施工安全性和经济性。 其他说明:文中不仅涵盖了基本的操作流程,还包括了许多实用的小技巧和注意事项,有助于避免常见的建模陷阱。同时鼓励读者尝试不同的参数配置,探索更多可能性。

Global site tag (gtag.js) - Google Analytics