Jackson方法的小例子

本文详细介绍了如何运用Jackson方法将数据库中的考生信息文件与考生成绩文件进行合并,包括数据结构表示、输入输出结构对应、结构图绘制等步骤,并提供了伪代码和源代码实现。此外,还对例子的实现方式进行了分析与讨论。

今天软件工程讲的jackson的软件开发方法,给了一个小例子,虽然例子不太实际,但对于理解软件开发过程,及jackson程序设计的各种规范还是有些用的,下面回顾一下。

老师不让拷ppt,笔记在书记113页。主要是把数据库中的考生信息文件和考生成绩文件合并起来。

jackson方法:

1,数据结构的表示。

2,输入结构与输出结构的对应关系。

3,确定结构图。

4,列出分配所有的操作和条件。

操作:1,停止。1,打开两个文件。3,建立输出文件。4,从输入文件中各读一条记录。5,生成一条新记录。6,将新记录写入到文件中。7,关闭所有文件。

条件:I(1),文件结束。


跟据图写出伪代码

产生新文件 seq

         打开两个输入文件

         建立一个输出文件

         从输入文件各读一条记录

         分析考生记录         iter until   文件结束

                   分析考生记录         seq

                   产生准考证号

                   产生姓名

                   产生地址

                   产生考分

                   生成新记录

                   将新记录写入到输出文件

                  处理考生记录         end

         分析考生记录文件结束         end

         关闭全部文件

         停止

产生新文件     end

然后就是用源代码实现上面的伪代码了。

在这之前,说说自己的看法。

首先,这个例子的工作完全可以通过数据库的连接操作完成,敲几行SQL语句就可以实现。

再则,数据库中是用表存数据的,结构图中总是说打开文件呀,关闭文件呀,觉得有点不妥。

最后,结构图中第二层的4操作(从输入文件各读一条记录)完全是没有用的,直接放到下面的循环中更好。

下面是源代码。

已通过编译调试。

用的是access数据库。

程序可以正常运行的前提是数据库中有三张表,StudentInfo,StudentGrade,StudentCom,前两张记录了考生的基本信息,后一张为空。

StudentInfo中有Num,Name,Address字段,StudentGrade有Num,Grade字段。StudentCom中有Num,Name,Adrress,Grade字段。

正常的结果是,会把StudentInfo,StudentGrade的信息合并到StudentCom中。

#include <cstdio>
#include <iostream>

//引入ADO库文件 注意C:\Program Files\Common Files\System\ado\msado15.dll这是指系统盘下,
//如果你的系统盘是D盘的话 那么应该是D:\Program Files\Common Files\System\ado\msado15.dll 
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
using namespace std;

void main()
{
	::CoInitialize(NULL);			//初始化OLE/COM库环境
	_ConnectionPtr pCon;			//申明Connection指针
	//申明Recordset指针
	_RecordsetPtr pRecSou1; //申明StudentInfo表的指针
	_RecordsetPtr pRecSou2; //申明StudentGrade表的指针
	_RecordsetPtr pRecDes; //申明StudentCom表指针
	pCon.CreateInstance(__uuidof(Connection));		//处始化Connection指针
	pRecSou1.CreateInstance(__uuidof(Recordset));		//处始化Recordset指针
	pRecSou2.CreateInstance(__uuidof(Recordset));		//处始化Recordset指针
	pRecDes.CreateInstance(__uuidof(Recordset));		//处始化Recordset指针
	try
	{
		//连接数据库
		pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=access.mdb","","",adModeUnknown);
	}
	catch(_com_error e)
	{
		cout<<e.ErrorMessage(); //输出错误信息
	}
	try
	{
		pRecSou1->Open("SELECT * FROM StudentInfo",
			_variant_t((IDispatch*)pCon,true),
			adOpenStatic,
			adLockOptimistic,
			adCmdText);
		//adOpenStatic: 静态 adOpenDynamic:动态 adLockOptimistic乐观封锁法 adCmdText:文本查询语句
		pRecSou2->Open("SELECT * FROM StudentGrade",
			_variant_t((IDispatch*)pCon,true),
			adOpenStatic,
			adLockOptimistic,
			adCmdText);
		pRecDes->Open("SELECT * FROM StudentCom",
			_variant_t((IDispatch*)pCon,true),
			adOpenStatic,
			adLockOptimistic,
			adCmdText);
	}
	catch(_com_error e)
	{
		cout<<e.ErrorMessage(); //输出错误信息
	}
	
	try
	{
		pRecSou1->MoveFirst();
		pRecSou2->MoveFirst();
		_variant_t   ra;
		pCon->Execute("delete * from StudentCom",&ra,adCmdText);
		
		_bstr_t Info_Num;
		_bstr_t Name;
		_bstr_t Address;
		_bstr_t Com_Num;
		_bstr_t Grade;
		
		while (!pRecSou1->adoEOF && !pRecSou2->adoEOF)
		{
			Info_Num = pRecSou1->GetCollect("Num");
			Name = pRecSou1->GetCollect("Name");
			Address = pRecSou1->GetCollect("Address");
			
			Com_Num = pRecSou2->GetCollect("Num");
			Grade = pRecSou2->GetCollect("Grade");		
			if (strcmp((char*)Info_Num,(char*)Com_Num)==0)
			{
				pRecDes->AddNew();
				pRecDes->PutCollect("Num",Info_Num);
				pRecDes->PutCollect("Name",Name);
				pRecDes->PutCollect("Address",Address);
				pRecDes->PutCollect("Grade",Grade);
				
				pRecDes->Update();
				
				pRecSou1->MoveNext();
				pRecSou2->MoveNext();
				
			}
			else
			{
				cout<<"error"<<endl;
				break;
			}
		}

		pRecDes->Close();
		pRecSou1->Close();
		pRecSou2->Close();
		pCon->Close();
	}
	catch (_com_error e)
	{
		cout<<e.ErrorMessage();
	}
}

下面是用文件操作实现的代码

#include <stdio.h>
#include <fstream>
#include <iostream>
using namespace std;
int kmps(char *,char* ,int);
void main()
{
	fstream file1,file2,fileDes;
	char bufInfo[64];
	char bufGread[64];
	char bufCom[64];
	file1.open("studentInfo.txt");//存放学生信息的文件
	file2.open("studnetGrade.txt");//存放学生成绩的文件
	fileDes.open("studentCom.txt",ios::out);//合并后的文件

	while (!file1.eof() && !file2.eof())
	{
		file1.getline(bufInfo,64);
		file2.getline(bufGread,64);
		int index = kmps(bufGread,")",0);
		strcat(bufInfo,bufGread+index);
		sprintf(bufCom,"%s\n",bufInfo);
		fileDes.write(bufCom,strlen(bufCom));
		cout<<bufCom;
	}

	file1.close();
	file2.close();
	fileDes.close();
}
//找出subStr在mainStr中的位置并返回
int kmps(char *mainStr,char* subStr,int startPos=0)
{
	int mlen=strlen(mainStr);
	int slen=strlen(subStr);
	char * pM=mainStr,*pS=subStr;
	int i=startPos,j=0;
	while (i<mlen && j<slen)
	{
		if (pM[i] == pS[j])
		{
			i++;
			j++;
		}
		else
		{
			i=i-j+1;
			j=0;
		}
	}
	if(j>=slen)
		return i-slen+1;
	else
		return 0;
}

在工程文件中有要有两个文件。StudentInfo.txt和StudentGrade.txt文件

StudentInfo.txt文件格式如(准考证号)(姓名)(地址)

StudentGrade.txt文件格式如(准号证号)(成绩)

每条记录一行。

<think>嗯,用户问的是Jackson的使用方法。首先,我需要确定他们指的是哪个Jackson。因为Jackson通常指的是Java的JSON处理库,对吧?可能还有其他的,但大部分情况下是Jackson库。所以首先要确认这一点,但根据上下文,用户可能已经在Java开发中遇到需要处理JSON的情况,所以应该先介绍Jackson的基本用途和核心功能。 接下来,用户可能想知道如何开始使用Jackson,包括添加依赖、基本读写操作。所以需要分步骤说明。比如在Maven中添加依赖项,这是第一步。然后,如何将Java对象转为JSON,也就是序列化,以及如何从JSON反序列化为对象。这里要给出简单的示例代码,比如使用ObjectMapper的writeValueAsString和readValue方法。同时,可能需要提到一些常见注解,比如@JsonProperty,用来处理字段名不同的情况。 然后,用户可能需要处理复杂的情况,比如日期格式、忽略未知字段等配置。这时候需要说明如何配置ObjectMapper,比如设置日期格式,启用忽略未知属性,这些配置可以通过configure方法或者注解来实现。 另外,用户可能对Jackson的高级功能感兴趣,比如处理泛型集合,或者多态类型处理。这时候需要用例子展示如何读取和写入List或Map类型,以及使用@JsonTypeInfo来处理多态类型。 还需要提到异常处理,比如捕获JsonProcessingException和JsonParseException,这样用户在遇到错误时可以正确处理。 最后,给出一个综合示例,整合前面提到的各个部分,让用户有一个完整的认识。同时,提醒用户参考官方文档和社区资源,以便深入学习和解决问题。 检查是否有遗漏的部分,比如Jackson的三个核心模块,但可能用户作为初学者,可能不需要一开始就接触这些,所以放在最后的高级特性里简要提及。另外,确保所有的代码示例使用正确的语法,比如用$$包围独立代码块,行内代码用$,不过根据用户的问题,他们可能更关注代码的结构和用法,而不是具体的LaTeX格式,但按照系统指令,需要正确应用格式。需要确保所有的步骤清晰,结构合理,帮助用户从基础到高级逐步掌握Jackson的使用方法。</think>以下为Jackson库的使用方法介绍,采用分步说明帮助您快速掌握核心功能: $$ \text{Jackson是Java生态中最流行的JSON处理库} $$ $$ \text{核心功能:对象与JSON的相互转换} $$ 一、环境配置(以Maven为例) ```xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency> ``` 二、基础用法(对象 ↔ JSON) 1. 创建ObjectMapper实例 ```java ObjectMapper mapper = new ObjectMapper(); ``` 2. Java对象转JSON(序列化) ```java User user = new User("张三", 25); String json = mapper.writeValueAsString(user); // 输出:{"name":"张三","age":25} ``` 3. JSON转Java对象(反序列化) ```java User parsedUser = mapper.readValue(json, User.class); ``` 三、常用配置 $$ \text{配置示例:日期格式与未知属性处理} $$ ```java mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd")); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); ``` 四、注解应用 1. 字段别名 ```java public class User { @JsonProperty("user_name") private String name; } ``` 2. 忽略字段 ```java @JsonIgnoreProperties(ignoreUnknown = true) public class User { ... } ``` 五、复杂类型处理 1. 泛型集合 ```java List<User> users = mapper.readValue(json, new TypeReference<List<User>>(){}); ``` 2. 多态类型 ```java @JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type") public abstract class Animal { ... } ``` 六、异常处理 ```java try { // 序列化/反序列化操作 } catch (JsonProcessingException e) { // 处理JSON格式错误 } ``` $$ \text{综合示例} $$ ```java public class Demo { public static void main(String[] args) throws Exception { ObjectMapper mapper = new ObjectMapper(); mapper.enable(SerializationFeature.INDENT_OUTPUT); User user = new User("李四", 30); String json = mapper.writeValueAsString(user); System.out.println(json); User parsed = mapper.readValue(json, User.class); } } ``` 高级特性建议: 1. 使用JsonNode进行树模型操作 2. 自定义序列化/反序列化器 3. 流式API处理大数据量 4. 支持YAML/XML等格式 官方文档:https://github.com/FasterXML/jackson-databind 注意:实际开发中建议配合单元测试验证转换逻辑,推荐使用JUnit+AssertJ进行验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值