java使用Gson进行json字符串反序列化转map对象时,int变为double的解决办法

java处理json字符串与java对象的互转,google家的Gson是个很好的工具。不过使用中也遇到了一些坑(有的其实更像是惊喜),与大家分享下。

一、json字符串反序列化转map对象时,int变为double的解决办法。

二、json字符串中格式时间字符串与Date对象的直接转换。

三、字符串与枚举的直接转换(自带此功能)。

Gson默认的坑

问题:使用Gsonjson字符串转为map时,原来的int类型反序列化后成为double类型。

Json字符串:

"{\"lngnum\":12,\"dbnum\":12.34,\"datetime\":\"2014-12-23 12:09:21\",\"date\":\"2014-12-23\",
\"next\":{\"lngnum\":12,\"dbnum\":12.34,\"datetime\":\"2014-12-23 12:09:21\",\"date\":\"2014-12-23\"}}";

实现方式:

/**
 * 使用默认的gson对象进行反序列化
 *
 * @param json
 * @param typeToken
 * @return
 */
public static <T> T fromJsonDefault(String json, TypeToken<T> typeToken) {
Gson gson = new Gson();
return gson.fromJson(json, typeToken.getType());
}

转化结果:

lngnum-12.0-Double//整型变为了浮点类型
dbnum-12.34-Double
datetime-2014-12-23 12:09:21-String
date-2014-12-23-String
====================
next-Map start
lngnum-12.0-Double//整型变为了浮点类型
dbnum-12.34-Double
datetime-2014-12-23 12:09:21-String
date-2014-12-23-String
next-Map end
====================

方法一:重新实现TypeAdapter

实现方式:

继续阅读java使用Gson进行json字符串反序列化转map对象时,int变为double的解决办法

基于websocket-api.jar的websocket java客户端

在之前文章《基于websocket-api.jar的websocket server服务》文章中,介绍了webosocket服务端编程与html5的客户端编写。此文章则重点介绍如何在使用java编写websocket client,以方便实现websocket接口的服务间调用。

此项目源代码已经在github托管,访问地址:websocket-demo

在开发过程中发现,websocket client需要依赖运行的tomcat容器,否则无法正常接收服务器端返回的消息。所以,是通过tomcat启动时,实例化bean时调用了客户端。如果博友实现了不依赖运行中的tomcat的调用方式,还望不吝赐教。

继续阅读基于websocket-api.jar的websocket java客户端

基于websocket-api.jar的websocket server服务

HTML5不仅提供了更加炫酷的系统资源的调用,也带来了websocket这一全双工的通信方式。再此之前,前端页面与服务端的通信基本只能依赖http协议进行短连接。为了能实现长连接的效果,多采用前端主动轮询的方式,持续从服务端拉取信息。虽说后来诞生了推送机制,但应用范围并不是十分广泛,而且性能较低。而websocket通信提供了另一种简单可靠而且效率更高的方式,weboscket通信只在建立连接是传递头信息,而在客户端提交与服务端推送信息时,是没有头信息传递的。而且,建立websocket连接后,服务端可以择时进行消息的主动推送。

本文介绍的是基于tomcat中自带jar包websocket-api.jar与html5内置对象WebSocket的服务端与浏览器客户端的通信demo。

一、java服务端websocket-server-demo示例

此示例的java服务端项目为pom项目,有关pom项目的内容,将在后续文章中介绍。下面介绍下weboscket-server-demo项目的几个主要文件。

1.pom项目配置文件(pom.xml)

添加依赖的jar包

<!-- tomcat websocket-api -->
    <dependency>
        <groupId>javax.websocket</groupId>
        <artifactId>javax.websocket-api</artifactId>
        <version>1.1</version>
        <scope>provided</scope>
    </dependency>
<!-- tomcat websocket-api -->

添加依赖tomcat插件

<!-- apache tomcat maven plugin -->
    <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
            <uriEncoding>UTF-8</uriEncoding>
            <port>8082</port>
            <path>/websocket-server</path>
        </configuration>
    </plugin>
<!-- //apache tomcat maven plugin -->

继续阅读基于websocket-api.jar的websocket server服务

web页面与java websocket接口的压力测试

对于网站开发,压力测试是少不了的。压力测试可以对网络,服务器,系统架构的优化程度进行检验。以便提前知道网站的负载能力,并未优化提供依据。

对于网站的压力测试,基本离不开下面两点的测试:web页面访问的压力测试和java接口的压力测试(我们接口是通过websocket实现)。

web页面访问压力测试工具可以使用apache自带的ab命令进行检测;java websocket接口的压力测试可以使用Jmeter+websocket插件进行检测。

ab安装与使用 继续阅读web页面与java websocket接口的压力测试

jsp或者java web的servlet获取get方式提交的数据的几种方式

最近由于工作需要,又重新拾起的java web的开发。之前大体学习过,今儿重新使用,却别有一番滋味。是的,看的更深入了,而不再仅仅是当时那种不明白但会用的状态!
先看源码~
第一个页面:一个可以通过get方式提交数据的页面,可以是普通的url方式:目标url?parameter1=value1&parameter2=value2或者form的get方式提交(其实最终还是转变为上一种方式)。这里使用了form的get方式提交数据:
<form name=”getForm” id=”getForm” action=”/getForm.jsp” method=”get”>
姓名:<input type=”text” name=”name” id=”name” /><br />
年龄:<input type=”text” name=”age” id=”age”><br />
介绍:<textarea name=”description” id=”description”></textarea><br />
<input type=”submit” id=”getList” name=”getList” value=”submit”/>
</form>
解析:这是把表单中的元素以get方式提交给同项目中的getForm.jsp页面,当然也可以是其他网站的jsp页面或者servlet。
第二部分:接收端。这里使用了jsp接收提交的数据。
<%
//获取提交的表单数据
//方式一获取
/*
*普通方法,通过request对象中的getParameter()方法获取需要的数据
*/
String name = request.getParameter(“name”);
String age = request.getParameter(“age”);
String description = request.getParameter(“description”);
//方法二获取
/*
*通过request对象中的getParameterNames()方法获取输入数据的name属性枚举
*通过遍历枚举获取所有name,并利用getParameter()方法获取对应值
*/
Map<String,String> map = new HashMap<String,String>();
Enumeration names = request.getParameterNames();
while(names.hasMoreElements()){
String key = (String)names.nextElement();
String value = request.getParameter(key);
map.put(key, value);
}
//方法三获取
/*
*通过request对象中的getParameterMap()方法获取提交数据的map集合,
*不过要注意的是键值对是String:String[]
*/
Map nextMap = request.getParameterMap();//键是String,值是String[]
//数据输出
PrintWriter pw = response.getWriter();
//方式一打印
pw.println(“name:” + name + “<br />”);
pw.println(“age:” + age + “<br />”);
pw.println(“description:” + description + “<br /><hr />”);
//方法二打印
Set<Entry<String,String>> set = map.entrySet();
Iterator<Entry<String,String>> it = set.iterator();
while(it.hasNext()){
Entry<String,String> entry = (Entry<String,String>)it.next();
String key = entry.getKey();
String value = entry.getValue();
pw.println(key + “:” + value + “<br />”);
}
pw.println(“<hr />”);
//方法三遍历
Set<Entry<String,String[]>> nextSet = nextMap.entrySet();
Iterator<Entry<String,String[]>> nextIt = nextSet.iterator();
while(nextIt.hasNext()){
Entry<String,String[]> entry = (Entry<String,String[]>)nextIt.next();
String key = entry.getKey();
String[] value = entry.getValue();
pw.println(key + “:” + value[0] + “<br />”);
}
%>
解析:以上介绍了三种方式获取数据,第一种是最为常规的方式,当然在获取大量数据时,需要挨个添加,比较费劲;第二个方式先获取传入参数的名字的枚举,在通过这个枚举获取每个名字对应的值;第三种方式十分省劲,直接获取传入参数的Map集合,不过要十分留意的是:这是一个String:String[]的键值对,当时就因为没仔细看方法的api,费了半天劲~
深入分析:1、以前从没有关注过jsp中的java代码不是类,这个问题,今天意识到这个问题,便分析了下:jsp页面在运行前会被翻译成一个java类,并被编译成字节码文件。而上面使用的request和response对象正是jsp的内置对象,这其实与servlet中的request和response很相像!2、以上方式同样适用于servlet获取get提交的数据。