2011-04-17 125 views
2

我需要如下解析其可限定的JSON項:解析特定JSON與谷歌GSON

{ 
    ... 
    "itemName": "" 
    ... 
} 

{ 
    ... 
    "itemName": { 

    } 
    ... 
} 

基本上,進料我從定義讀取itemName如一個空字符串,如果沒有值,否則它是一個正常的JSON對象,我可以解析得很好。

我相信這是什麼導致了我遇到的GSON錯誤,雖然我可能是錯的。

我該如何解析包含如上所示的字段而不會導致GSON錯誤的JSON訂閱源?或者我怎樣才能抑制這個錯誤,並繼續解析?

這裏是logcat的:

ERROR/AndroidRuntime(32720): Caused by: com.google.gson.JsonParseException: Expecting object found: ""

我使用GSON包括在AdMob 4.0.4罐子

回答

2

你需要實現自定義解串器這一點。以下是一個例子。

// output: 
// {Outer: item=null} 
// {Outer: item={Inner: value=foo}} 

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; 

public class Foo 
{ 
    static String json1 = "{\"item\":\"\"}"; 
    static String json2 = "{\"item\":{\"value\":\"foo\"}}"; 

    public static void main(String[] args) 
    { 
    GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.registerTypeAdapter(Inner.class, new InnerDeserializer()); 
    Gson gson = gsonBuilder.create(); 
    Outer outer1 = gson.fromJson(json1, Outer.class); 
    System.out.println(outer1); 
    Outer outer2 = gson.fromJson(json2, Outer.class); 
    System.out.println(outer2); 
    } 
} 

class InnerDeserializer implements JsonDeserializer<Inner> 
{ 
    @Override 
    public Inner deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) 
     throws JsonParseException 
    { 
    if (json.isJsonPrimitive()) 
    { 
     return null; 
    } 
    return new Gson().fromJson(json, typeOfT); 
    } 
} 

class Outer 
{ 
    Inner item; 

    @Override 
    public String toString() 
    { 
    return String.format("{Outer: item=%s}", item); 
    } 
} 

class Inner 
{ 
    String value; 

    @Override 
    public String toString() 
    { 
    return String.format("{Inner: value=%s}", value); 
    } 
} 

這很容易被改爲返回,而不是nullInner實例,這取決於期望的,當然。