智能机器人“小昆”的实现(三)实体类的实现

在上一篇文章中,我们实现了获取服务器返回数据的工具类。没有读过的朋友可以点击下面链接:

http://www.cnblogs.com/fuly550871915/p/4852568.html

这一篇文章要在上一篇的基础上,实现两个重要的实体类,一个是ChatMsg,用来封装数据从而实现标准的消息格式;一个是ResultMsg,用来封装从服务器端返回的数据。

一、准备工作

在这里,解析json字符串,我们打算使用第三方包GSON。首先点击下面的地址,下载该包。

http://code.google.com/p/google-gson/downloads/list

下面完成后解压,将gson-2.2.4添加到项目的libs目录下即可。

二、编写实体类

首先编写ResultMsg类。为什么需要这样一个类呢?这是因为我们打算从服务器端返回的数据中提取字段code和字段text的包含的信息。因此我们编写类ResultMsg,它有两个String成员变量,分别就是code 和text。这样子,使用gson解析数据,就会直接将服务器端的数据截取code和text两个字段信息映射为一个ResultMsg对象,即封装为一个ResultMsg对象。 好了,ResultMsg的代码很简单,如下:

 1 package com.fuly.kun.bean;
 2
 3
 4 //用来封装从服务器端返回的数据
 5 //从服务器端返回的数据主要包括code和Text字段
 6 public class ResultMsg {
 7
 8
 9     private String code;
10     private String text;
11
12
13
14     public String getCode() {
15         return code;
16     }
17     public void setCode(String code) {
18         this.code = code;
19     }
20     public String getText() {
21         return text;
22     }
23     public void setText(String text) {
24         this.text = text;
25     }
26
27
28
29 }

然后再编写ChatMsg类。那么为什么需要这样一个类呢?其实就是为了生成我们的标准的消息。从前面的运行效果的界面可以看到,一个标准的消息,应该包括消息内容,消息的时间,消息的类型(是自己发送的消息还是从服务器端返回的消息)。看我们的代码吧,如下:

 1 package com.fuly.kun.bean;
 2
 3 import java.util.Date;
 4
 5
 6 //用来把从服务器端获得的数据或者我们发送的消息变成一个标准的消息格式
 7 //应该包括消息文本,获取的时间,以及消息的类型(是从服务器端获取的还是我们自己发送的)
 8
 9 public class ChatMsg {
10
11     private String msg;//消息
12     private Date date;//日期
13     private Type type;//消息类型
14
15     public enum Type{
16
17         INPUT,OUTPUT
18     }
19
20
21
22     public ChatMsg() {
23
24
25     }
26
27     public ChatMsg(String msg, Date date, Type type) {
28         this.msg = msg;
29         this.date = date;
30         this.type = type;
31     }
32
33     public String getMsg() {
34         return msg;
35     }
36
37     public void setMsg(String msg) {
38         this.msg = msg;
39     }
40
41     public Date getDate() {
42         return date;
43     }
44
45     public void setDate(Date date) {
46         this.date = date;
47     }
48
49     public Type getType() {
50         return type;
51     }
52
53     public void setType(Type type) {
54         this.type = type;
55     }
56
57
58 }

三、HttpUtil类的第二次编写

之前在HttpUtil中,我们只实现了获取服务器返回的数据的方法(即doGet()方法)。它获取的是一个json类型的字符串。下面我们要实现解析这个字符串,并且顺便将其封装为一个标准的消息。HttpUtil修改如下:

  1 package com.fuly.kun.util;
  2
  3 import java.io.BufferedReader;
  4 import java.io.ByteArrayOutputStream;
  5 import java.io.IOException;
  6 import java.io.InputStream;
  7 import java.io.InputStreamReader;
  8 import java.io.UnsupportedEncodingException;
  9 import java.net.HttpURLConnection;
 10 import java.net.MalformedURLException;
 11 import java.net.ProtocolException;
 12 import java.net.URL;
 13 import java.net.URLEncoder;
 14 import java.util.Date;
 15
 16 import android.util.Log;
 17
 18 import com.fuly.kun.bean.ChatMsg;
 19 import com.fuly.kun.bean.ChatMsg.Type;
 20 import com.fuly.kun.bean.ResultMsg;
 21 import com.google.gson.Gson;
 22 import com.google.gson.JsonSyntaxException;
 23
 24
 25 //该类用来向服务器发送消息以及处理从服务器返回的数据
 26 public class HttpUtil {
 27
 28
 29     //该方法用来解析从服务器端获得的数据,封装为ChatMsgMsg对象
 30
 31     public static ChatMsg getResultMsg(String jsonData){
 32
 33
 34
 35             ChatMsg cm = new ChatMsg();
 36
 37             ResultMsg rm = null;
 38             try {
 39                 //下面两句代码已经完成了json数据的提取和封装
 40                 Gson gson = new Gson();
 41                 rm = gson.fromJson(jsonData, ResultMsg.class);
 42                 cm.setMsg(rm.getText().toString());
 43
 44             } catch (Exception e) {
 45                 cm.setMsg("服务器异常,请重新尝试");
 46             }
 47
 48             cm.setDate(new Date());
 49             cm.setType(Type.OUTPUT);//消息类型为OUTPUT,即从服务器端返回的
 50             return cm;
 51
 52     }
 53
 54
 55     //该方法用来处理从服务器返回的数据
 56     public static String doGet(String msg){
 57
 58         //获取相应的网址
 59         URL msgUrl = setMsgParam(msg);
 60
 61
 62
 63         HttpURLConnection connection = null;
 64         try {
 65                 //然后开始和服务器建立连接
 66                 connection = (HttpURLConnection) msgUrl.openConnection();
 67
 68                 connection.setRequestMethod("GET");
 69                 connection.setConnectTimeout(5000);
 70                 connection.setReadTimeout(5000);
 71             } catch (ProtocolException e) {
 72
 73                 e.printStackTrace();
 74             } catch (IOException e) {
 75
 76                 e.printStackTrace();
 77             }
 78         InputStream in = null;
 79         try {
 80             //下面对获得输入流进行读取
 81
 82              in = connection.getInputStream();
 83             BufferedReader reader = new BufferedReader(new InputStreamReader(in));
 84             StringBuilder response = new StringBuilder();
 85             String line ;
 86             while((line = reader.readLine())!= null){
 87                 response.append(line);
 88             }
 89
 90             String str = response.toString();
 91             //因为发现从服务器端返回的json数据中,经常带有特殊字符<br>
 92             //所以在这里特地将该特殊字符替换为转义字符\n
 93             str = str.replace("<br>", "\n");
 94             return str;
 95
 96         } catch (IOException e) {
 97
 98             e.printStackTrace();
 99         }finally{
100             if(connection != null){
101                 connection.disconnect();
102             }
103             if(in != null){
104                 try {
105                     in.close();
106                 } catch (IOException e) {
107                     e.printStackTrace();
108                 }
109             }
110         }
111
112         return null;
113
114     }
115
116     //该方法用来返回相应的网址
117     private static URL setMsgParam(String msg) {
118
119         //注意此处应写你自己的api key
120           String APIKEY = "761b4f79ebdf8b26d0bf7e0c816b32b4";
121
122           try {
123               //将编码格式设置为utf-8,千万别忘记这一步
124             String mMsg = URLEncoder.encode(msg, "utf-8");
125             String getURL = "http://www.tuling123.com/openapi/api?key=" + APIKEY + "&info=" + mMsg;
126             URL getUrl = new URL(getURL);
127
128             return getUrl;
129         } catch (UnsupportedEncodingException e) {
130             e.printStackTrace();
131         } catch (MalformedURLException e) {
132             e.printStackTrace();
133         }
134
135           return null;
136
137     }
138
139 }

好了,至此,我们的项目算是成功一半了。从服务器端获取数据并封装为标准消息的工作我们已经完成了。不过现在我们完成的都是看不见的工作,在下一篇中,我们来实现可以看得见的工作吧。

时间: 2024-10-29 10:47:54

智能机器人“小昆”的实现(三)实体类的实现的相关文章

智能机器人“小昆”的实现(一)项目介绍以及图灵授权认证

一.项目介绍 这个小项目开发了一个叫做“小昆”的图灵智能机器人,它可以陪你聊天,听你抱怨.而且可以在后台设置机器人知识库,打造你的专属智能机器人.我们先看几张运行的效果图,介绍一下项目吧.如下图: 功能说明:其实很简单,只要你在编辑框中输入你想要对机器人小昆说的话,然后点击发送按钮(即那个蝴蝶),就可以愉快的跟小昆聊天了. 原理说明:本项目智能机器人小昆的实现主要是调用了第三方的API,即图灵机器人的接口.而其他的模块则是android原生的代码编写.并不算是复杂. 通过本项目你可以学习到: (

智能机器人“小昆”的实现(四)布局实现

经过漫长的代码编写,我们终于可以进行布局的编写了.我们再来看一下效果图,如下: 首先可以看到,主布局很简单,上面是一个ListView,底部并排放着一个编辑框和一个发送按钮.然后就是ListView的子项布局,我们发现有两种.一种是发送消息的布局,整体靠右,左边是一个消息框,右边是一个头像,头像下面有昵称.还有一种是服务器返回的消息的布局,整体 靠左,往右依次为头像和消息框,且头像下也有昵称.好了,分析完毕,下面我们就开始编写这个布局吧. 一.素材 这个项目中所用的图片素材,请点击下面的链接,下

智能机器人“小昆”的实现(二)获取服务器数据工具类的编写及测试

没有取得图灵机器人认证的朋友可以看上一篇,点击下面的地址即可: http://www.cnblogs.com/fuly550871915/p/4852148.html 已经取得认证的朋友,可以继续往下做了.下面就开始我们的实际代码编写.在这篇文章中,我们要实现通过调用图灵机器人API获取返回的数据的功能.而且搭建相应的测试环境,看看我们这个功能实现的到底正确不正确. 一.获得服务器返回数据的工具类的实现 主要是android中的简单的网络编程知识的运用.代码如下: 1 package com.f

YbSoftwareFactory 代码生成插件【十九】:实体类配合数据库表字段进行属性扩展的小技巧

实体类通常需要和数据库表进行了ORM映射,当你需要添加新的属性时,往往同时也需要在数据库中添加相应的字段并配置好映射关系,同时可能还需对数据访问组件进行重新编译和部署才能有效.而当你开始设计一个通用数据访问组件后,因为项目需求的不同和需求的不断变化演变,很难不能保证不会再添加额外的属性和字段.特别是项目部署运行后,添加一个属性和字段带来的额外维护的工作量可能要远远超过对代码进行调整的工作量.本文提供了属性字段扩展的一种思路,在满足核心字段可通过实体类强类型进行访问的同时,还可通过C# 4.0提供

02-Hibernate实体类的三种状态

一.Hibernate的实体类有三种状态 Transient:瞬时状态,不被hibernate session管理,而且实体数据在数据库不存在 Persistent:持久化状态,被session管理,此时的对象被放在session的缓存中,实体对象存在数据库中. Detached:离线状态,实体对象在数据库中有数据与之对应,但是不被session管理 注意:被session所管理的实体对象,当对象的属性发生改变,在提交事务的时候会自动更新改变后的属性到数据库中. 下图是hibernate试题对象

MP实战系列(三)之实体类讲解

首先说一句,mybatis plus实在太好用了! mybaits plus的实体类: 以我博客的用户类作为讲解 package com.blog.entity; import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableLogic; imp

Spring简单获得实体类的实例, 使用ApplicationContext()方法的几点注意事项

今天接触了Spring的初步用法, 感觉跟实例化实体类没啥区别, 像这种简单的代码还不如直接实例化来的方便, 这样使用Spring的话总共需要三个文件 第一个当然是一个实体类了, 定义好属性, getter和setter方法, 别忘了构造一个无参的构造方法. public class HelloWorld { private String mingzi; private String dizhi; private User user; public void sayHello() { Syste

java总结第三次//类和对象2、3

四.类和对象2 主要内容:Java类的继承.方法的重写.覆盖.访问控制.super 关键字.多态性及其应用 1.继承 要求:Java只支持单继承,不允许多重继承 一个子类只能有一个父类 一个父类可以派生出多个子类 子类继承了父类,就继承了父类的方法和属性. 在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法. 因而,子类通常比父类的功能更多. 在Java 中,继承的关键字用的是“extends”,即子类是对父类的“扩展”. 注意:子类不能继承父类中私有的(private)成员变量

AutoMapper(一)——实现数据契约和实体类之间的转换

以前做过Object到Object的转换方法的封装,底层主要还是靠反射取值赋值+循环来实现的.最近在公司里维护旧系统,这个系统使用了WCF,当时就很好奇他们的数据契约到实体模型的转换时怎么做的,之后查看源码,发现他们居然是一个属性一个属性的赋值过来的,当时就给我雷到了,难道就没有人举得这个地方可以封装起来吗? 据我目前了解,有三种方法可以实现这个实体类到实体类的转换过程,下面来简述下这三种方式. 第一种,也是最简单的一种,是用list自带的转换方法,但是这种方法需要自己定义转换规则,写起来也挺麻