com.taosdata.jdbc.utils.UInt64Codec Maven / Gradle / Ivy
package com.taosdata.jdbc.utils;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.JSONLexer;
import com.alibaba.fastjson.parser.JSONScanner;
import com.alibaba.fastjson.parser.JSONToken;
import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import com.alibaba.fastjson.serializer.SerializeWriter;
import com.alibaba.fastjson.serializer.SerializerFeature;
import java.io.IOException;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Calendar;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
import static com.alibaba.fastjson.util.TypeUtils.longValue;
public class UInt64Codec implements ObjectSerializer, ObjectDeserializer {
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,
int features) throws IOException {
SerializeWriter out = serializer.getWriter();
if (object instanceof Long) {
long value = (Long) object;
if (value < 0) {
String encodedValue = Long.toUnsignedString(value);
out.writeString(encodedValue);
}else {
out.writeLong(value);
}
} else {
out.writeNull(SerializerFeature.WriteNullNumberAsZero);
}
}
@Override
public T deserialze(DefaultJSONParser parser, Type clazz, Object fieldName) {
final JSONLexer lexer = parser.lexer;
Long longObject;
try {
final int token = lexer.token();
if (token == JSONToken.LITERAL_INT) {
long longValue = lexer.longValue();
lexer.nextToken(JSONToken.COMMA);
longObject = longValue;
} else if (token == JSONToken.LITERAL_FLOAT) {
BigDecimal number = lexer.decimalValue();
longObject = longValue(number);
lexer.nextToken(JSONToken.COMMA);
} else {
if (token == JSONToken.LBRACE) {
JSONObject jsonObject = new JSONObject(true);
parser.parseObject(jsonObject);
longObject = castToLong(jsonObject);
} else {
Object value = parser.parse();
longObject = castToLong(value);
}
if (longObject == null) {
return null;
}
}
} catch (Exception ex) {
throw new JSONException("parseLong error, field : " + fieldName, ex);
}
return clazz == AtomicLong.class
? (T) new AtomicLong(longObject.longValue())
: (T) longObject;
}
@Override
public int getFastMatchToken() {
return JSONToken.LITERAL_INT;
}
public static Long castToLong(Object value) {
if (value == null) {
return null;
}
if (value instanceof BigDecimal) {
return longValue((BigDecimal) value);
}
if (value instanceof Number) {
return ((Number) value).longValue();
}
if (value instanceof String) {
String strVal = (String) value;
if (strVal.length() == 0 //
|| "null".equals(strVal) //
|| "NULL".equals(strVal)) {
return null;
}
if (strVal.indexOf(',') != -1) {
strVal = strVal.replaceAll(",", "");
}
try {
BigInteger number = new BigInteger(strVal);
return number.longValue();
} catch (NumberFormatException ex) {
//
}
JSONScanner dateParser = new JSONScanner(strVal);
Calendar calendar = null;
if (dateParser.scanISO8601DateIfMatch(false)) {
calendar = dateParser.getCalendar();
}
dateParser.close();
if (calendar != null) {
return calendar.getTimeInMillis();
}
}
if (value instanceof Map) {
Map map = (Map) value;
if (map.size() == 2
&& map.containsKey("andIncrement")
&& map.containsKey("andDecrement")) {
Iterator iter = map.values().iterator();
iter.next();
Object value2 = iter.next();
return castToLong(value2);
}
}
if (value instanceof Boolean) {
return (Boolean) value ? 1L : 0L;
}
throw new JSONException("can not cast to long, value : " + value);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy