json主要有两种形式,分别是object和array,采用递归解析json字符串。
import org.codehaus.jackson.JsonParser;
public interface ValueParser {
public ValueBean parse(JsonParser jsonParser);
}
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonToken;
public class BaseValueParser implements ValueParser {
public BaseValueParser(){
super();
}
protected Map parseObject(JsonParser jsonParser) throws JsonParseException, IOException {
JsonToken jsonToken = jsonParser.getCurrentToken();
if (jsonToken == null) {
jsonToken = jsonParser.nextToken();
}
Map<String, Object> object = new HashMap<String, Object>();
while ((jsonToken = jsonParser.nextToken()) != JsonToken.END_OBJECT) {
String key = jsonParser.getText();
JsonToken nextToken = jsonParser.nextToken();
if (isSimpleValue(nextToken)) {
String value = jsonParser.getText();
object.put(key, value);
} else {
ValueBean vb = parse(jsonParser);
Object value = vb.isObject() ? vb.getObject() : vb.getArray();
object.put(key, value);
}
}
return object;
}
protected List<Object> parseArray(JsonParser jsonParser) throws JsonParseException, IOException {
JsonToken jsonToken = jsonParser.getCurrentToken();
if (jsonToken == null) {
jsonToken = jsonParser.nextToken();
}
List<Object> list = new ArrayList<Object>();
while ((jsonToken = jsonParser.nextToken()) != JsonToken.END_ARRAY) {
if (isSimpleValue(jsonToken)) {
String value = jsonParser.getText();
list.add(value);
} else {
ValueBean vb = parse(jsonParser);
Object value = vb.isObject() ? vb.getObject() : vb.getArray();
list.add(value);
}
}
return list;
}
protected boolean isSimpleValue(JsonToken jsonToken) {
return !jsonToken.equals(JsonToken.START_ARRAY) && !jsonToken.equals(JsonToken.START_OBJECT);
}
public ValueBean parse(JsonParser jsonParser) {
ValueBean vb = new ValueBean();
try {
JsonToken jsonToken = jsonParser.getCurrentToken();
if (jsonToken == null) {
jsonToken = jsonParser.nextToken();
}
if (JsonToken.START_OBJECT.equals(jsonToken)) {
vb.setObject(parseObject(jsonParser));
return vb;
} else if (JsonToken.START_ARRAY.equals(jsonToken)) {
vb.setArray(parseArray(jsonParser));
return vb;
} else {
throw new RuntimeException("parser json error,jsonParser is" + jsonParser);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
单元测试
import org.codehaus.jackson.JsonParser;
import com.duitang.dboss.resolve.BaseDataResolverFactory;
import com.duitang.dboss.resolve.DataResolverFactory;
public class ValueParseTester {
public static void main(String[] args) {
ValueParser parser = new BaseValueParser();
DataResolverFactory dataResolverFactory = new BaseDataResolverFactory();
JsonParser jsonParser = dataResolverFactory.getJsonParser("{'tagSet': ['a', 'b'], 'page': '1'}");
ValueBean result = parser.parse(jsonParser);
System.out.println(result.getObject());
jsonParser = dataResolverFactory.getJsonParser("{'tagSet': [1, 2], 'page': '1'}");
result = parser.parse(jsonParser);
System.out.println(result.getObject());
jsonParser = dataResolverFactory.getJsonParser("{'tagSet': [1.12, 2.34], 'page': '1'}");
result = parser.parse(jsonParser);
System.out.println(result.getObject());
jsonParser = dataResolverFactory.getJsonParser("{'tagSet': [{'id':1,'name':2}], 'page': '1'}");
result = parser.parse(jsonParser);
System.out.println(result.getObject());
}
}