2010-09-30 46 views
-1

我使用Gson从网站解析JSON文件。我在Java方面很新,希望找到正确的方法,我应该这样做。创建使用Gson库的类

一切工作正常,但我有几个问题。由于我从网站获取这些Json文件,我无法控制,json文件中的某些值为空。使用这些方法的正确方法是什么?我已经有方法从我的类中获取值并更改为所需的类型。

isp_ornd = “104%或类似的东西”

bsp_ornd =如上。

win_time =“2米35S 990”

正如我说没有,我只是想找出使用​​GSON和Java这样做的正确方法的任何问题的IM。

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

我花了一些尝试,但我想我终于明白的问题是什么。

Gson没有内置机制将格式为"23%"的JSON字符串转换为Java int。定制解串器或后反序列化处理都是必要的。

自定义时间转换也一样。

以下是使用Gson与自定义反序列化器来处理JSON的例子,就像我了解的目标一样。

input.json内容:

{ 
    "isp_ornd":"104%", 
    "bsp_ornd":"64%", 
    "win_time":"2m 35s 990" 
} 

例解串来处理isp_orndwin_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; 
    } 
}