Skip to content

Commit

Permalink
Issue #205
Browse files Browse the repository at this point in the history
调整结构, 并修正一个bug
  • Loading branch information
juqkai committed May 4, 2012
1 parent 5b02244 commit 3e50261
Showing 1 changed file with 91 additions and 75 deletions.
166 changes: 91 additions & 75 deletions src/org/nutz/json/JsonConvert.java
@@ -1,6 +1,7 @@
package org.nutz.json;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
Expand Down Expand Up @@ -63,11 +64,8 @@ public class JsonConvert {
private LinkedList<Integer> arrayIndex = new LinkedList<Integer>();
//关系
private Map<String, List<String>> relation = new HashMap<String, List<String>>();
private Map<String, Object> newobj = new HashMap<String, Object>();

public JsonConvert() {
newobj.put("obj", null);
}
private Rebuild structure = new Rebuild();

/**
* 转换
Expand All @@ -78,7 +76,7 @@ public JsonConvert() {
public Object convert(Object obj, String model){
initRelation(model);
convertObj(obj);
return newobj.get("obj");
return structure.fetchNewobj();
}
/**
* 转换对象
Expand Down Expand Up @@ -145,31 +143,107 @@ private void renew(String path, Object object) {
if(relation.containsKey(path)){
List<String> dests = relation.get(path);
for(String dest : dests){
new structure(dest, object).inject();
structure.put(dest, object);
}
}
}








/**
* 初始化关系
* @param model
*/
private void initRelation(String model){
Object obj = Json.fromJson(Streams.fileInr(model));
loadRelation(obj, "");
}
/**
* 解析配置信息
* @param obj
* @param path
*/
private void loadRelation(Object obj, String path) {
if(obj instanceof Map){
loadMapRelation((Map<?, ?>) obj, path);
} else if(obj instanceof List){
loadListRelation((List<?>) obj, path);
} else {
throw new RuntimeException("无法识别的类型!");
}
}
/**
* 解析List配置信息
* @param obj
* @param path
*/
@SuppressWarnings("unchecked")
private void loadListRelation(List<?> obj, String path) {
if(obj.size() <= 0){
return;
}
if(obj.get(0) instanceof String){
relation.put(path, (List<String>) obj);
return;
}
loadRelation(obj.get(0), path + "[]");
}
/**
* 解析MAP配置信息
* @param obj
* @param path
*/
private void loadMapRelation(Map<?, ?> obj, String path) {
for(Object key : obj.keySet()){
Object val = obj.get(key);
if(val instanceof String){
relation.put(path + space(path) + key.toString(), Lang.list(val.toString()));
continue;
}
loadRelation(obj.get(key), path + space(path) + key.toString());
}
}

private String space(String path){
return path == "" ? "" : ".";
}



/**
* 构建新的对象
* @author juqkai(juqkai@gmail.com)
*/
class structure{
class Rebuild{
private String[] keys;
private Object val;
private Integer arrayItem = 0;
private Integer arrayItem;
private Map<String, Object> newobj = new HashMap<String, Object>();

private Rebuild(){
newobj.put("obj", null);
}

private structure(String keys, Object obj){
public void put(String keys, Object obj){
init(keys, obj);
injectMap(newobj, 0);
}
private void init(String keys, Object obj){
keys = "obj." + keys;
this.keys = keys.split("\\.");
val = obj;
arrayItem = 0;
}

public void inject(){
injectMap(newobj, 0);
public Object fetchNewobj(){
return newobj.get("obj");
}

/**
* 注入MAP
* @param obj
Expand Down Expand Up @@ -225,7 +299,11 @@ private void injectList(List<Object> list, int i) {
index = arrayIndex.get(arrayItem ++);
}
if(i == keys.length - 1){
list.set(index, val);
if(val instanceof Collection){
list.addAll((Collection<? extends Object>) val);
} else {
list.add(index, val);
}
return;
}
if(list.size() <= index){
Expand All @@ -237,66 +315,4 @@ private void injectList(List<Object> list, int i) {
}







/**
* 初始化关系
* @param model
*/
private void initRelation(String model){
Object obj = Json.fromJson(Streams.fileInr(model));
loadRelation(obj, "");
}
/**
* 解析配置信息
* @param obj
* @param path
*/
private void loadRelation(Object obj, String path) {
if(obj instanceof Map){
loadMapRelation((Map<?, ?>) obj, path);
} else if(obj instanceof List){
loadListRelation((List<?>) obj, path);
} else {
throw new RuntimeException("无法识别的类型!");
}
}
/**
* 解析List配置信息
* @param obj
* @param path
*/
@SuppressWarnings("unchecked")
private void loadListRelation(List<?> obj, String path) {
if(obj.size() <= 0){
return;
}
if(obj.get(0) instanceof String){
relation.put(path, (List<String>) obj);
return;
}
loadRelation(obj.get(0), path + "[]");
}
/**
* 解析MAP配置信息
* @param obj
* @param path
*/
private void loadMapRelation(Map<?, ?> obj, String path) {
for(Object key : obj.keySet()){
Object val = obj.get(key);
if(val instanceof String){
relation.put(path + space(path) + key.toString(), Lang.list(val.toString()));
continue;
}
loadRelation(obj.get(key), path + space(path) + key.toString());
}
}

private String space(String path){
return path == "" ? "" : ".";
}
}

0 comments on commit 3e50261

Please sign in to comment.