Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

让Nutz Json支持多泛型 #85

Closed
fjay opened this issue Oct 25, 2011 · 10 comments
Closed

让Nutz Json支持多泛型 #85

fjay opened this issue Oct 25, 2011 · 10 comments
Milestone

Comments

@fjay
Copy link
Member

fjay commented Oct 25, 2011

目前nutz json对泛型的支持,采用了NutType,使用方法如下:
List list = (List) Json.fromJson( NutType.list(Abc.class),
Streams.fileInr("org/nutz/json/list.txt"));
这种写法有些纠结不是嘛,除了不支持多泛型,还得强制执行……

可以参考下fastjson的写法,最关键的一句是:
List<List<Map<String, Bean>>> list = JSON.parseObject(text, new TypeReference< List<List<Map<String, Bean>>> >() {});

完美支持多泛型,而且无缝复制,告别强制转型^_^
http://code.alibabatech.com/wiki/display/FastJSON/TypeReference

So,各位Nutz大侠们,有空瞅瞅吧……

@juqkai
Copy link
Member

juqkai commented Oct 25, 2011

TypeReference的实现想法, 可以借鉴, 满不错的. 不过, 感觉有点不够.
TypeReference中有个小问题, getGenericSuperclass() 方法返回的不一定就是ParameterizedType类型的, 所以, 最好是做个判断.

另外关于Nutz泛型的支持, 不仅是Json, 其它地方也存在这个问题, 对泛型的支持并不好. 主要是没有提取出一套关于泛型的实现出来, 实现机制上各个地方使用的方式也不一样.

要调整成泛型支持的话, 工作量满大的, 很多地方都需要把Class<?> 改成 Type...

我觉得可以使用ParameterizedTypeImpl来做, JDK里面有这个实现, 不知道怎么的引用不了...搞不懂是什么原因. 不过, 它的实现也满简单的. 概念, 接口更符合JAVA泛型规范一点吧.

@zozoh
Copy link
Member

zozoh commented Oct 25, 2011

TypeReference 貌似不属于标准 JDK 的类吧

不过应该考虑支持一个类似这样的写法

List list = Json.fromJsonAsList(Abc.class, Streams.fileInr("org/nutz/json/list.txt"));

@juqkai
Copy link
Member

juqkai commented Oct 25, 2011

List list = Json.fromJsonAsList(Abc.class, Streams.fileInr("org/nutz/json/list.txt"));

这种写法应该好支持吧, 把现在只处理单个JSON, 改成处理JSON集, 并组装返回,

@juqkai
Copy link
Member

juqkai commented Oct 25, 2011

原来 NutType 就是 ParameterizedType 类型的呀... 悲剧, 之前还在纠结有些东西怎么实现呢, 没想到都有了... 看来得重新看代码了...

@zozoh
Copy link
Member

zozoh commented Oct 25, 2011

@juqkai 我也是才看到,呵呵, Wendal 加的哦

那,这个 bug 你 fix 咯

加这几个函数:

 <T> List<T> Json.fromJsonAsList(Class<T> eleType, CharSequence cs);

 <T> List<T> Json.fromJsonAsList(Class<T> eleType, Reader reader);

 <T> T[] Json.fromJsonAsArray(Class<T> eleType, CharSequence cs);

 <T> T[] Json.fromJsonAsArray(Class<T> eleType, Reader reader);

 <T> Map<String,T> Json.fromJsonAsMap(Class<T> eleType, CharSequence cs);

 <T> Map<String,T> Json.fromJsonAsMap(Class<T> eleType, Reader reader);

@juqkai
Copy link
Member

juqkai commented Oct 26, 2011

已实现上面几个接口.
我把这个关了哈

@juqkai juqkai closed this as completed Oct 26, 2011
@ghost
Copy link

ghost commented Oct 29, 2011

zozoh commented "TypeReference 貌似不属于标准 JDK 的类吧"

(o一-一)
本来就是fastjson自己扩展的一个类
和NutType的作用类似。

我提这个issue的目的是支持多泛型
目前NutType只支持简单的List、Map,如果我需要
List< List < Map < String, Bean > >
这种泛型
或者Custom < String, Bean >
目前的Nutz Json是不支持反序列化的
这才是我这个issue的目的(o一-一)

@juqkai
Copy link
Member

juqkai commented Oct 30, 2011

你说的这种情况NutType是支持的, 只是写法上面不好看而已:
Type type = new NutType(List.class, new NutType(Map.class, String.class, Bean.class));

Type type = new NutType(Custom.class, String.class, Bean.class);

@ghost
Copy link

ghost commented Oct 30, 2011

我来举个实际的例子吧,如果我的json是这样子

{
"loginName" :"user1",
"body" :{
"mobile" :"13123132321"
}
}
对应的类是这样子:
public class JsonRequest {
private String loginName;
private T body;
}

public class Employee{
protected String mobile;
}

request = (JsonRequest) Json
.fromJson(new NutType(request.getClass(), Employee.class), json);

你试试看吧,默认是不支持的,而fastjson支持这种反序列化

@juqkai
Copy link
Member

juqkai commented Nov 1, 2011

这个已经实现了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants