Требуется адаптер для преобразования длинных значенийJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Требуется адаптер для преобразования длинных значений

Сообщение Anonymous »

У меня есть этот код GSON, используемый для анализа файлов JSON:

Код: Выделить всё

import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;

public class LongTypeAdapter extends TypeAdapter {

private static final Logger logger = LoggerFactory.getLogger(LongTypeAdapter.class);

@Override
public Long read(JsonReader reader) throws IOException {
if (reader.peek() == JsonToken.NULL) {
reader.nextNull();
return null;
}
String stringValue = reader.nextString();
try {
if (!StringUtils.isEmpty(stringValue)) {
return (long) Double.parseDouble(stringValue);
}
} catch (NumberFormatException e) {
logger.error("Failed to convert string to long ", e);
}
logger.error("Failed to convert string to long {}", stringValue);
return null;
}

@Override
public void write(JsonWriter writer, Long value) throws IOException {
if (value == null) {
writer.nullValue();
return;
}
writer.value(value);
}
}
.....

Код: Выделить всё

  private static final Gson gson = new GsonBuilder().registerTypeAdapter(Long.class, new LongTypeAdapter())
      .registerTypeAdapter(Double.class, new DoubleTypeAdapter()).create();
Я хочу перенести этот код в Джексон:

Код: Выделить всё

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;

public class LongDeserializer extends StdDeserializer {
private static final Logger logger = LoggerFactory.getLogger(LongDeserializer.class);

public LongDeserializer() {
super(Long.class);
}

@Override
public Long deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
JsonToken token = p.currentToken();

if (token == JsonToken.VALUE_NULL) {
return null;
}

// Handle string values like "123.45"
if (token == JsonToken.VALUE_STRING) {
String text = p.getText().trim();
if (StringUtils.isEmpty(text)) {
return null;
}
try {
return (long) Double.parseDouble(text);
} catch (NumberFormatException e) {
logger.error("Failed to convert string to long: {}", text, e);
return null;
}
}

// Handle numeric tokens directly
if (token == JsonToken.VALUE_NUMBER_INT) {
return p.getLongValue();
}
if (token == JsonToken.VALUE_NUMBER_FLOAT) {
return (long) p.getDoubleValue();
}

// Unexpected token
logger.error("Unexpected token {} for Long value", token);
return null;
}
}
Я не уверен, нужен ли мне этот специальный десериализатор для длинных значений Джексона, который выполнит это преобразование автоматически?

Подробнее здесь: https://stackoverflow.com/questions/798 ... ong-values
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»