org.codehaus.jackson序列号json绑定spring3.0对象的错误解决办法

java对象结构是

Role.java里有 pring Set<Resource> resources;

下面是传输到后台的json

{id:"11",resources:[{id:"402881972acf9acd012ad075b68a0005",checkState:false},{id:"402881972acf9acd012ad075da010006",checkState:true}]}

发现报错

严重: Servlet.service() for servlet dispatcher threw exception
org.codehaus.jackson.JsonParseException: Unexpected character ('i' (code 105)): was expecting double-quote to start field name
at [Source: [B@1328280; line: 1, column: 3]
at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:943)
at org.codehaus.jackson.impl.JsonParserBase._reportError(JsonParserBase.java:636)
at org.codehaus.jackson.impl.JsonParserBase._reportUnexpectedChar(JsonParserBase.java:569)

我使用的是这个函数转换为json字符串

function obj2str(o){
var r = [];
if(typeof o =="string") return "/""+o.replace(/([/'/"//])/g,"//$1").replace(/(/n)/g,"//n").replace(/(/r)/g,"//r").replace(/(/t)/g,"//t")+"/"";
if(typeof o == "object"){
if(!o.sort){
r[0]="{"
for(var i in o){
r[r.length]=i;
r[r.length]=":";
r[r.length]=obj2str(o[i]);
r[r.length]=",";
}
if(!!document.all && !/^/n?function/s*toString/(/)/s*/{/n?/s*/[native code/]/n?/s*/}/n?/s*$/.test(o.toString)){
r[r.length]="toString:"+o.toString.toString();
r[r.length]=",";
}
r[r.length-1]="}"
}else{
r[0]="["
for(var i =0;i<o.length;i++){
r[r.length]=obj2str(o[i]);
r[r.length]=",";
}
r[r.length-1]="]"
}
return r.join("");
}
return o.toString();
}

无奈自己在后台写了 String json="{/"id/":/"111/"};

居然成功了, 仔细观察原来是 jackson要求的json格式很严格

{id:"11",resources:[{id:"402881972acf9acd012ad075b68a0005",checkState:false},{id:"402881972acf9acd012ad075da010006",checkState:true}]}

发现 id 这些变量都少了 " 冒号

googel了 JSON.String Prototype.toJSON 两个js工具, 但是跟jquery1.4.2冲突。

最好还是返回到最初用的那个函数

r[r.length]=i;

改为

r[r.length]='"'+i+'"';

@RequestMapping(value = "authRoleResource.html")
public String authRoleResource(String json,ModelMap model) throws JsonParseException, JsonMappingException, IOException{
byte[] b = json.getBytes();
Role role=this.getObjectMapper().readValue(b, 0, b.length, Role.class);

绑定成功。 大家可以看到这样很方便, readValue也可以支持字符串参数的, 这里用byte是提高性能。

json-lib最新是支持jdk1.5 现在已经停止更新了

json-lib转换集合的时候需要一个map指定 resources, Resource.class 麻烦了一步。

jackson性能比json-lib高出5倍以上, 我看到多篇文章有测试数据, 自己没测, 只是觉得他的API比较好用。

从社区的活跃程度来看 jackson是最好的, 而且也是spring3源码里集成的json转换工具。

大家在spring3.0里的 @ResponseBody 用的就是jackson这东西, 只是没注意而已。

另外如果用Hibernate不用OpenSessionInView的话需要修改 (OpenSessionInView 超恶心的东西, 性能的万恶之源)

BeanPropertyWriter.java

的函数为下面这段, 不然会报 No Session 错误。 我用的jackson是1.5.6版本。

public final Object get(Object bean) throws Exception { if (_accessorMethod != null) { Object obj=_accessorMethod.invoke(bean); if(obj==null) return null; if(obj.getClass().getName().indexOf("javassist")>0 || bean.getClass().getName().indexOf("javassist")>0) return null; else return _accessorMethod.invoke(bean); } return _field.get(bean); }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jackson所需要的所有jar jackson-all-1.6.2.jar jackson-core-asl-1.6.2.jar jackson-mapper-asl-1.6.2.jar jakarta-oro.jar 1. 背景 目前维护的产品使用jackson处理json,现整理一下jackson相关资料,希望对初次接触jackson的新手有所帮助。 jackson主页: http://jackson.codehaus.org/ jackson document: http://wiki.fasterxml.com/JacksonJavaDocs JacksonInFiveMinutes: http://wiki.fasterxml.com/JacksonInFiveMinutes 本文主要内容译自JacksonInFiveMinutes,增加了部分示例,转载请注明出处。 受java平台上各种处理xml的类库(StAX, JAXB等)启发,Jackson提供一种处理jsonjava类库。Jackson的目标是为开发者提供快速、准确、轻量级和用起来最爽的json处理类库。本文将概括介绍Jackson的主要功能和相关功能的使用示例。 2. 使用方式 Jackson提供三种可选的json处理方式: 1) Streaming API 又称Incremental parsing/generation, 受StAX API启发,以非关联递增方式读写json内容。 通过 org.codehaus.jackson.JsonParser读取,通过org.codehaus.jackson.JsonGenerator写入。 2) Tree Model 通过基于内存的树形结构来描述json数据,和 XML DOM类似。通过org.codehaus.jackson.map.ObjectMapper构建树,树由JsonNode节点组成。 3) Data Binding 基于属性访问或注解的方式将json和POJO对象互相转换, 受JAXB基于注解的处理方式启发。通过org.codehaus.jackson.map.ObjectMapper读写json数据。它包含两种类型: 3.1 Simple Data Binding 用于jsonJava Maps, Lists, Strings, Numbers, Booleans and nulls的相互转换。 3.2 Full Data Binding 用于jsonJava Bean的相互转换。 下面从使用的角度上比较三种处理方式: Streaming API 执行效率最高,读写速度最快,另外两种方式都基于它实现; Tree Model 是最灵活的; Data Binding 通常是最方便使用的;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值