Мне потребовалось несколько попыток, но я, наконец, понял, в чем вопрос.
У Gson нет встроенного механизма для преобразования строки JSON в формате "23%"
в Javaint
.Потребуется либо пользовательский десериализатор, либо обработка после десериализации.
То же самое относится и к пользовательскому преобразованию времени.
Ниже приведен пример использования Gson с пользовательскими десериализаторами для обработки JSON, как я понимаю.является целевым.
input.json Содержимое:
{
"isp_ornd":"104%",
"bsp_ornd":"64%",
"win_time":"2m 35s 990"
}
Пример десериализатора для обработки форматов isp_ornd
и win_time
:
import java.io.FileReader;
import java.lang.reflect.Type;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
public class Foo
{
int isp_ornd;
int bsp_ornd;
long win_time;
int num1;
long num2;
public static void main(String[] args) throws Exception
{
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(int.class, new PercentIntDeserializer());
gsonBuilder.registerTypeAdapter(long.class, new TimeLongDeserializer());
Gson gson = gsonBuilder.create();
Foo foo = gson.fromJson(new FileReader("input.json"), Foo.class);
System.out.println(gson.toJson(foo));
}
}
class PercentIntDeserializer implements JsonDeserializer<Integer>
{
@Override
public Integer deserialize(JsonElement json, Type integerType, JsonDeserializationContext context)
throws JsonParseException
{
if (json.isJsonNull()) return 0;
String input = json.getAsString();
JsonPrimitive jsonPrimitive = json.getAsJsonPrimitive();
if (jsonPrimitive.isNumber()) return json.getAsInt();
input = input.replace("%", "");
input = input.replaceAll(" ", "");
if (input.length() == 0) return 0;
return Integer.parseInt(input);
}
}
class TimeLongDeserializer implements JsonDeserializer<Long>
{
@Override
public Long deserialize(JsonElement json, Type longType, JsonDeserializationContext context)
throws JsonParseException
{
if (json.isJsonNull()) return 0L;
JsonPrimitive jsonPrimitive = json.getAsJsonPrimitive();
if (jsonPrimitive.isNumber()) return json.getAsLong();
String input = json.getAsString();
input = input.replace("m", ":");
input = input.replace(".", ":");
input = input.replace("s", ":");
input = input.replaceAll(" ", "");
if (input.length() == 0) return 0L;
String[] timeSplit = input.split(":");
if (timeSplit.length != 3) return 0L;
long minutes = Long.parseLong(timeSplit[0]);
long seconds = Long.parseLong(timeSplit[1]);
long millis = Long.parseLong(timeSplit[2]);
return minutes * 36000 + seconds * 1000 + millis * 10;
}
}