in odpswriter/src/main/java/com/alibaba/datax/plugin/writer/odpswriter/OdpsWriterProxy.java [438:613]
private List parseArray(JSONArray jsonArray, ArrayTypeInfo arrayTypeInfo) throws ParseException {
if (null == jsonArray) {
return null;
}
List result = new ArrayList();
switch (arrayTypeInfo.getElementTypeInfo().getOdpsType()) {
case BIGINT:
for (int i = 0; i < jsonArray.size(); i++) {
result.add(jsonArray.getLong(i));
}
return result;
/**
* 双精度浮点
*/
case DOUBLE:
for (int i = 0; i < jsonArray.size(); i++) {
result.add(jsonArray.getDouble(i));
}
return result;
/**
* 布尔型
*/
case BOOLEAN:
for (int i = 0; i < jsonArray.size(); i++) {
result.add(jsonArray.getBoolean(i));
}
return result;
/**
* 日期类型
*/
case DATETIME:
// TODO 精度
for (int i = 0; i < jsonArray.size(); i++) {
result.add(dateFormat.parse(jsonArray.getString(i)));
}
return result;
/**
* 字符串类型
*/
case STRING:
for (int i = 0; i < jsonArray.size(); i++) {
result.add(jsonArray.getString(i));
}
return result;
/**
* 精确小数类型
*/
case DECIMAL:
for (int i = 0; i < jsonArray.size(); i++) {
result.add(jsonArray.getBigDecimal(i));
}
return result;
/**
* 1字节有符号整型
*/
case TINYINT:
for (int i = 0; i < jsonArray.size(); i++) {
result.add(jsonArray.getByte(i));
}
return result;
/**
* 2字节有符号整型
*/
case SMALLINT:
for (int i = 0; i < jsonArray.size(); i++) {
result.add(jsonArray.getShort(i));
}
return result;
/**
* 4字节有符号整型
*/
case INT:
for (int i = 0; i < jsonArray.size(); i++) {
result.add(jsonArray.getInteger(i));
}
return result;
/**
* 单精度浮点
*/
case FLOAT:
for (int i = 0; i < jsonArray.size(); i++) {
result.add(jsonArray.getFloat(i));
}
return result;
/**
* 固定长度字符串
*/
case CHAR:
for (int i = 0; i < jsonArray.size(); i++) {
result.add(new Char(jsonArray.getString(i),
((CharTypeInfo) arrayTypeInfo.getElementTypeInfo()).getLength()));
}
return result;
/**
* 可变长度字符串
*/
case VARCHAR:
for (int i = 0; i < jsonArray.size(); i++) {
result.add(new Varchar(jsonArray.getString(i),
((VarcharTypeInfo) arrayTypeInfo.getElementTypeInfo()).getLength()));
}
return result;
/**
* 时间类型
*/
case DATE:
// TODO string -> date need timezone
// TODO how to use odps Record
for (int i = 0; i < jsonArray.size(); i++) {
result.add(java.sql.Date.valueOf(jsonArray.getString(i)));
}
return result;
/**
* 时间戳
*/
case TIMESTAMP:
for (int i = 0; i < jsonArray.size(); i++) {
result.add(Timestamp.valueOf(jsonArray.getString(i)));
}
return result;
/**
* 字节数组
*/
case BINARY:
for (int i = 0; i < jsonArray.size(); i++) {
result.add(Base64.decodeBase64(jsonArray.getString(i)));
}
return result;
/**
* 日期间隔
*/
case INTERVAL_DAY_TIME:
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject json = jsonArray.getJSONObject(i);
result.add(new IntervalDayTime(json.getInteger("totalSeconds"), json.getInteger("nanos")));
}
return result;
/**
* 年份间隔
*/
case INTERVAL_YEAR_MONTH:
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject json = jsonArray.getJSONObject(i);
result.add(new IntervalYearMonth(json.getInteger("years"), json.getInteger("months")));
}
return result;
/**
* 结构体
*/
case STRUCT:
for (int i = 0; i < jsonArray.size(); i++) {
result.add(
parseStruct(jsonArray.getJSONObject(i), (StructTypeInfo) arrayTypeInfo.getElementTypeInfo()));
}
return result;
/**
* MAP类型
*/
case MAP:
for (int i = 0; i < jsonArray.size(); i++) {
result.add(parseMap(jsonArray.getJSONObject(i), (MapTypeInfo) arrayTypeInfo.getElementTypeInfo()));
}
return result;
/**
* ARRAY类型
*/
case ARRAY:
for (int i = 0; i < jsonArray.size(); i++) {
result.add(parseArray(jsonArray.getJSONArray(i), (ArrayTypeInfo) arrayTypeInfo.getElementTypeInfo()));
}
return result;
default:
return result;
}
}