`
fly2wind
  • 浏览: 27351 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类

CXF,RESTEASY返回格式为JSON时,如果类型为String的值为数值时,JSON中引号消失的问题解决

阅读更多
在使用CXF或RESTEASY等框架构建REST方式的WEB SERVICE的应用时候

如:
使用JAXB注解定义一个返回的对象
@XmlRootElement(name = "user")
@XmlType(propOrder = { "id", "nickName", "signature", "birthday", "gender" })
@XmlAccessorType(XmlAccessType.FIELD)
public class GetResponse {
		private Long id;
		private String nickName;
...


当返回格式为JSON的时候,如果nickName的值是12345,则返回的JSON内容为:

{"id":1,"nickName":12345}


按理说json的内容应该为:
{"id":1,"nickName":"12345"}

12345应该有引号。




要解决这个问题,需要修改相关的底层代码:


//修改com.sun.xml.bind.v2.runtime.XMLSerializer.java 


public void leafElement(Name tagName, String data, String fieldName) throws SAXException, IOException, XMLStreamException {
		Object currentObj = cycleDetectionStack.peek();
		if (out instanceof com.sun.xml.bind.v2.runtime.output.XMLStreamWriterOutput) {  //判断out的类型,XMLStreamWriterOutput为json或其他非xml格式的writer 
			Field field = null;
			try {
				field = currentObj.getClass().getDeclaredField(fieldName);
			} catch (Exception e1) {
				try {
					field = currentObj.getClass().getField(fieldName);
				} catch (Exception e2) {

				}      取的当前字段的类型信息
			}
			if (field != null && field.getType().getName().equals("java.lang.String")) { //如果为字符串并且字符串为数字格式,增加标记 $:
				if (isNumber(data)) {
					data = "$:" + data;
				}
			}
		}
....

//修改org.codehaus.jettison.mapped.DefaultConverter.java或自己定义一个实现

public Object convertToJSONPrimitive(String text) {
		if (text == null)
			return text;
		Object primitive = null;

		// Attempt to convert to Integer 
//----------------------------数值类型字符串不能正确转换的元凶在这里 
		try {
			primitive = ENFORCE_32BIT_INTEGER ? Integer.valueOf(text) : Long.valueOf(text);
		} catch (Exception e) {/**/
		}
		// Attempt to convert to double
		if (primitive == null) {
			try {
				Double v = Double.valueOf(text);
				if (!v.isInfinite() && !v.isNaN()) {
					primitive = v;
				} else {
					primitive = text;
				}
			} catch (Exception e) {/**/
			}
		}
		// Attempt to convert to boolean
		if (primitive == null) {
			if (text.trim().equalsIgnoreCase("true") || text.trim().equalsIgnoreCase("false")) {
				primitive = Boolean.valueOf(text);
			}
		}

		if (primitive == null || !primitive.toString().equals(text)) {
			// Default String
			if (text.startsWith("$:")) {          //如果字符串含有标记,去掉标记
				text = text.substring(2);
			}

			primitive = text;
		}

		return primitive;
	}

3
0
分享到:
评论
3 楼 huanglanfa 2012-06-21  
自己写个转换JSON的类吧,复写以下,给你个我的JSON参考。
package com.szreach.utlil;

import java.beans.PropertyDescriptor;
import java.sql.Date;
import java.util.List;
import java.util.Map;
import org.apache.commons.beanutils.PropertyUtils;

public class JSONUtils {

public static String stringToJson(String s) {
if (s == null) {
return nullTOJson();
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
switch (ch) {
case '"':
sb.append("\\\"");
break;
case '\\':
sb.append("\\\\");
break;
case '\b':
sb.append("\\b");
break;
case '\f':
sb.append("\\f");
break;
case '\n':
sb.append("\\n");
break;
case '\r':
sb.append("\\r");
break;
case '\t':
sb.append("\\t");
break;
case '/':
sb.append("\\/");
break;
default:
if (ch >= '\u0000' && ch <= '\u001F') {
String ss = Integer.toHexString(ch);
sb.append("\\u");
for (int k = 0; k < 4 - ss.length(); k++) {
sb.append('0');
}
sb.append(ss.toUpperCase());
} else {
sb.append(ch);
}
}
}
return sb.toString();
}

/***
* 对象转换成为json 这里是描述这个方法的作用
*
* @return
* @author Java
* @date 2012-05-23 下午02:59:13
*/
public static String objectToJson(Object obj) {
StringBuffer json = new StringBuffer();
if (obj == null) {
json.append("\"\"");
} else if (obj instanceof Integer) {
json.append("\"").append(numberToJson((Integer) obj)).append("\"");
} else if (obj instanceof Boolean) {
json.append("\"").append(booleanToJson((Boolean) obj)).append("\"");
} else if (obj instanceof String) {
json.append("\"").append(stringToJson(obj.toString())).append("\"");
} else if (obj instanceof Object[]) {
json.append("\"").append(arrayToJson((Object[]) obj)).append("\"");
} else if (obj instanceof List) {
json.append("\"").append(listToJson((List<?>) obj)).append("\"");
} else if (obj instanceof Map) {
json.append("\"").append(mapToJson((Map<?, ?>) obj)).append("\"");
} else if (obj instanceof java.sql.Date) {
json.append("\"").append(dateToJson((Date) obj)).append("\"");
} else if (obj instanceof java.util.Date) {
json.append("\"").append(dateToJson((Date) obj)).append("\"");
} else {
json.append("\"").append(stringToJson(obj.toString())).append("\"");
}
return json.toString();
}

/**
* 这里是描述这个方法的作用
*
* @param obj
* @return {["pname":"val"],["pname":"val"]...}
* @author Java
* @date 2012-05-23 下午03:02:49
*/
public static String beanToJson(Object obj) {
StringBuffer json = new StringBuffer("{");
try {
PropertyDescriptor[] pds = PropertyUtils
.getPropertyDescriptors(obj);
if (pds != null && pds.length > 0) {
for (PropertyDescriptor pd : pds) {
if (pd.getName().equals("class"))
continue;
String pname = objectToJson(pd.getName());
String val = objectToJson(pd.getReadMethod().invoke(obj));
json.append(pname);
json.append(":");
json.append(val);
json.append(",");
}
json.setCharAt(json.length() - 1, '}');
} else {
json.append("}");
}
} catch (Exception e) {
e.printStackTrace();
}
return json.toString();
}

public static String beanToJson(Object obj, String params) {
StringBuffer json = new StringBuffer("{");
try {
PropertyDescriptor[] pds = PropertyUtils
.getPropertyDescriptors(obj);
if (pds != null && pds.length > 0) {
for (PropertyDescriptor pd : pds) {
String pname = pd.getName();
if (pname.equals("class"))
continue;
if (params.indexOf(pname) == -1)
continue;
pname = objectToJson(pname);
String val = objectToJson(pd.getReadMethod().invoke(obj));
json.append(pname);
json.append(":");
json.append(val);
json.append(",");
}
json.setCharAt(json.length() - 1, '}');
} else {
json.append("}");
}
} catch (Exception e) {
e.printStackTrace();
}
return json.toString();
}

/**
* 这里是描述这个方法的作用
*
* @param obj
* @return
* @see
* @author Java
* @date 2012-05-23 下午03:02:27
*/
public static String mapToJson(Map<?, ?> map) {
StringBuilder json = new StringBuilder();
json.append("{");
if (map != null && map.size() > 0) {
for (Object key : map.keySet()) {
json.append("" + objectToJson(key) + "");
json.append(":");
json.append("" + objectToJson(map.get(key)) + "");
json.append(",");
}
json.setCharAt(json.length() - 1, '}');
} else {
json.append("}");
}
return json.toString();
}

/**
* 这里是描述这个方法的作用
*
* @param obj
* @return
* @author Java
* @date 2012-05-23 下午03:02:15
*/
public static String listToJson(List<?> list) {
StringBuffer json = new StringBuffer();
json.append("[");
if (list != null && list.size() > 0) {
for (Object obj : list) {
json.append(beanToJson(obj));
json.append(",");
}
json.setCharAt(json.length() - 1, ']');
} else {
json.append("]");
}
return json.toString();
}

public static String listToJson(List<?> list, String params) {
StringBuffer json = new StringBuffer();
json.append("[");
if (list != null && list.size() > 0) {
for (Object obj : list) {
json.append(beanToJson(obj, params));
json.append(",");
}
json.setCharAt(json.length() - 1, ']');
} else {
json.append("]");
}
return json.toString();
}

/**
* 这里是描述这个方法的作用
*
* @param obj
* @return
* @see
* @author Java
* @date 2012-05-23 下午03:02:05
*/
private static String arrayToJson(Object[] array) {
StringBuilder json = new StringBuilder();
json.append("{");
if (array != null && array.length > 0) {
for (Object obj : array) {
json.append(objectToJson(obj));
json.append(",");
}
json.setCharAt(json.length() - 1, ']');
} else {
json.append("}");
}
return json.toString();
}

public static String dateToJson(Date date) {
return date.toString();
}

public static String numberToJson(Number number) {
return number.toString();
}

public static String booleanToJson(Boolean bool) {
return bool.toString();
}

public static String nullTOJson() {
return "";
}

/**
* 非空验证 这里是描述这个方法的作用
*
* @param arg0
* @return
* @author Java
* @date 2012-05-23 下午02:51:43
*/
public static Boolean isNull(Object arg0) {
if (arg0 == null)
return true;
String arg = (String) arg0;
return ("".equals(arg.trim()) || "null".equals(arg)) ? true : false;
}
}
2 楼 fly2wind 2012-05-30  
是的,整个转换过程是 Object->XML-JSON, Object到 XML转换过程中,类型会丢失
1 楼 dingding5060 2012-05-15  
这个问题一定要修改底层代码吗?


我也出现这样的问题了的,有的数值型字段会带引号,有的字段却不带,很奇怪

相关推荐

    CXF利用Json格式传输对象

    在处理JSON数据时,可能会遇到格式错误、类型转换异常等问题,需要进行适当的错误处理。CXF提供了异常映射机制,可以将服务端的异常转换为对应的HTTP状态码和错误消息。 总结,Apache CXF结合JSON为开发者提供了...

    cxf框架的webservice,传递json,xml

    CXF提供了一种名为Jettison的插件,使得服务可以返回JSON格式的数据。使用`@Produces("application/json")`注解可以声明服务方法将返回JSON。 示例: ```java @WebService @Produces("application/json") ...

    CXF发布的REST服务返回JSON格式数据

    CXF发布的REST服务返回JSON格式数据,只有服务端代码,没有客户端代码,可以通过http://localhost:9999/roomservice/room、http://localhost:9999/roomservice/room/001来访问测试数据。

    webservice cxf spring整合返回list,bean,string,json,xml项目完整实例

    本项目旨在展示如何在Java企业级应用(Java EE)中,通过Apache CXF框架创建Web服务,并结合Spring框架进行管理,从而能够灵活地返回不同类型的数据,包括List、自定义Bean对象、纯文本String以及常见的数据交换格式...

    cxf传输json

    在这个场景中,CXF被用来作为客户端和服务端之间交换JSON格式数据的工具。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易于人阅读和编写,同时也易于机器解析和生成,而被广泛用于网络通信...

    CXF2.6 spring 提供rest服务输出xml或json等格式数据

    在这个例子中,`@Path`注解定义了服务的URL路径,`@GET`表示这是一个GET请求,`@Produces`指定了可以返回的媒体类型(XML和JSON)。在实现类中,你需要创建一个Person对象并转换为XML或JSON格式。CXF会自动处理这些...

    ApacheCxf提供Json格式接口服务demo

    在本示例中,我们将探讨如何使用Apache CXF来提供JSON格式的接口服务。 首先,让我们了解CXF的关键组件。CXF包括一个SOAP处理器,用于处理SOAP消息,以及一个RESTful处理器,用于处理RESTful(基于HTTP协议的JSON或...

    CXF整合spring同时支持JSON和XML配置的HelloWorld

    当我们需要在Web服务中同时处理JSON和XML数据格式时,CXF和Spring的整合就显得尤为重要。 首先,我们需要在项目中引入CXF和Spring的相关依赖。这通常通过Maven或Gradle的配置文件来完成,添加对应的库,如`cxf-rt-...

    Apache CXF + Spring3 + REST + JSON配置

    在"Apache CXF + Spring3 + REST + JSON配置"中,我们主要探讨如何利用Apache CXF和Spring 3框架来构建RESTful服务,并使用JSON作为数据交换格式。以下是一些关键知识点: 1. **Spring 3集成CXF**: - 首先,你...

    CXF结合Spring发布Json格式WebService示例

    本实例工程使用Apache CXF组件快速开发WebService。基于Spring框架,使用了Maven项目,但由于时间原因,只使用了Maven Project的框架,还是使用lib文件夹存放所需的cxf库,传入传出对象支持Json格式。

    cxf集成Spring的restful WebService接口以Json形式表现

    本项目主要展示了如何使用CXF和Spring构建一个能够以JSON格式返回数据的RESTful WebService接口。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它...

    接受json格式的CXF+Spring整合的REST的服务完整接口实例

    发布CXF+Spring整合的REST的服务接口完整实例,其中包括数据库连接池,json数据格式传递数据,HttpURLConne的get和post方式调用接口,以及获取访问者ip地址工具类等众多的技术实例。

    cxf使用中编码问题

    例如,如果CXF服务配置为接收GBK编码,但客户端发送的是UTF-8编码的数据,解析时就会出现问题。 2. **XML文档编码**:CXF作为基于SOAP的服务,很多交互都是通过XML进行的。XML文件头通常会声明其编码,如`...

    04.使用CXF处理JavaBean式的复合类型和List集合类型的形参和返回值

    同样,如果服务返回一个产品列表,CXF会将Java List对象转换为XML格式的数组,方便客户端解析。 在实际应用中,我们需要在CXF服务端创建服务接口和实现,然后通过JAXB(Java Architecture for XML Binding)进行...

    CXF整合spring 支持restful xml json 上传下载的HelloWorld

    在这个“CXF整合spring 支持restful xml json 上传下载的HelloWorld”示例中,我们将探讨如何实现XML和JSON数据格式的支持,以及文件上传和下载功能。 首先,我们需要在Spring配置文件中声明CXF的Servlet,这样可以...

    cxf spring json xml jar包

    cxf&spring;&json;&xml;所需要的jar包和实例

    json解析所需要的所有jar包,webservice cxf所有的jar

    4. JSON与CXF交互的库:如果你需要在Web服务中使用JSON,可能还需要额外的库,如cxf-rt-features-json,它提供了JSON数据格式的支持。 在"lib"这个压缩包文件中,你应该找到了所有这些必要的jar包。在Java项目中,...

    cxf创建客户端出现GBK编码问题解决的jar

    当CXF客户端在与服务器交互时,如果服务器返回的响应或请求的数据中包含非GBK字符,而客户端默认使用GBK编码解析,就会出现乱码或者无法解析的情况。 为了解决这个问题,我们需要理解并正确配置CXF的字符编码策略。...

Global site tag (gtag.js) - Google Analytics