我正在使用Gson解析网站上的json文件。我是Java的新手,想找出正确的方法。
一切正常,但我有几个问题。由于我从一个我无法控制的网站获取这些Json文件,因此json文件中的某些值为null。使用这些方法的正确方法是什么?我有方法从我的类中获取值并更改为所需的类型。
isp_ornd =“104%或类似的东西”
bsp_ornd =如上所述。
win_time =“2m 35s 990”
正如我所说,我没有任何问题,我只是想找出使用Gson和Java来做这件事的正确方法。
public class ResultData {
private String isp_ornd;
private String bsp_ornd;
private String win_time;
private RunnerData[] runners;
public int getIspOrnd() {
if(isp_ornd != null){
isp_ornd = isp_ornd.replace("%", "");
isp_ornd = isp_ornd.replace(" ", "");
if(isp_ornd.equals(""))
isp_ornd = "0";
return Integer.parseInt(isp_ornd);
}
else
return 0;
}
public int getBspOrnd() {
if(bsp_ornd != null){
bsp_ornd = bsp_ornd.replace("%", "");
bsp_ornd = bsp_ornd.replace(" ", "");
if(bsp_ornd.equals(""))
bsp_ornd = "0";
return Integer.parseInt(bsp_ornd);
}
else
return 0;
}
public long getWinTime() {
long minutes = 0;
long seconds = 0;
long milliseconds = 0;
long totalTime = 0;
if(win_time != null){
win_time = win_time.replace("m ",":");
win_time = win_time.replace(".",":");
win_time = win_time.replace("s","");
win_time = win_time.replace(" ","");
String[] timeSplit = win_time.split(":");
if(timeSplit.length == 3){
minutes = Long.parseLong(timeSplit[0]);
seconds = Long.parseLong(timeSplit[1]);
milliseconds = Long.parseLong(timeSplit[2]);
totalTime = (minutes * 36000) + (seconds * 1000) + (milliseconds*10);
}
else
totalTime = 0;
}
else
totalTime = 0;
return totalTime;
}
public RunnerData[] getRunners() {
return runners;
}
public String toString(){
return getIspOrnd() + " " + getBspOrnd() + " " + getWinTime() + " " + win_time;
}
}
答案 0 :(得分:0)
我花了几次尝试,但我想我终于明白了问题是什么。
Gson没有内置机制将"23%"
格式的JSON字符串转换为Java int
。自定义反序列化器或后反序列化处理是必要的。
自定义时间转换也是如此。
下面是一个使用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;
}
}