2011-01-03 5 views
0

JSONで問題が発生するBugzillaサーバーから戻ってくることがあります。「テキスト」:{}、時には「テキスト」:「blah blah blah」を返すことがあります。 Bugzillaは、バグの説明がない場合は前者を返します。私はなぜそれがはるかに賢明な "テキスト"として戻って来ないのか不思議だ。それはそうだ。GoogleのGsonを使用してBugzilla JSONをデシリアライズする際の問題

私はGsonのターゲットオブジェクトのStringという名前のテキストを持っている場合は、それはそれはそれはオブジェクトではなく文字列だと言うので、それは{}のケースを見ているとき、オブジェクト:

Exception in thread "main" com.google.gson.JsonParseException: The 
JsonDeserializer StringTypeAdapter failed to deserialized json object {} given 
the type class java.lang.String 

方法I上の任意の提案をGsonはこれを解析できますか?

+0

Bugzillaで使用しているJSONインターフェイスは何ですか?私はJSON-RPCインターフェイスの作成者です。それが起こる状況は想像できません。これがREST APIの場合、それは別の話です。これは、別々に管理された別個の製品です。 –

+0

これは私が使用しているREST APIです。 –

答えて

1

Gsonは、元の質問の状況に対してカスタム逆シリアル化が必要です。以下はこのような例の1つです。代わりにカスタムDを使用して

[{"text":"some text"},{"text":""}] 

[ 
    { 
    "text":"some text" 
    }, 
    { 
    "text":{} 
    } 
] 

Foo.java:

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; 

public class Foo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.registerTypeAdapter(String.class, new StringDeserializer()); 
    Gson gson = gsonBuilder.create(); 
    Thing[] things = gson.fromJson(new FileReader("input.json"), Thing[].class); 
    System.out.println(gson.toJson(things)); 
    } 
} 

class Thing 
{ 
    String text; 
} 

class StringDeserializer implements JsonDeserializer<String> 
{ 
    @Override 
    public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) 
     throws JsonParseException 
    { 
    if (json.isJsonPrimitive()) return json.getAsString(); 
    return ""; 
    } 
} 

出力input.json

もちろん、Thing.class型のエシリアライザも可能です。これは、Stringごとに追加の処理を追加しないという利点がありますが、Thingの他のすべての属性を「手動で」処理することに悩まされます。

0

textフィールドをObjectと宣言してください。次に、次のようなことをしてください:

public String getTextAsString() { 
    if (text instanceof String) { 
     return (String) text; 
    else { 
     return null; 
    } 
} 

これはBugzillaプロジェクトのバグとして報告する必要があります。この動作には正当な理由はありません。

+0

"text"がObject型であると宣言されていた場合、Gsonはまだ "text":{}と呼ばれ、 "型情報は利用できず、対象オブジェクトはプリミティブではありません:{}" –

関連する問題