2011-01-03 1 views
0

Ich habe ein Problem in JSON Ich komme wieder von einem Bugzilla-Server, weil es manchmal "Text" zurückgibt: {} und manchmal "Text": "bla bla bla". Bugzilla gibt den ersten zurück, wenn für einen Fehler keine Beschreibung angegeben wurde. Ich bin verwirrt, warum es nicht als der viel vernünftigere "Text" zurückkommt: "Aber es tut und das ist es.Problem Deserialisieren Bugzilla JSON mit Googles Gson

Wenn ich eine Zeichenfolge mit dem Namen Text im Zielobjekt für Gson habe, Objekte es, wenn es den {} Fall sieht, weil er sagt, das ist ein Objekt und kein String:

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

Vorschläge, wie ich kann Gson dies analysieren lassen?

+0

Welche JSON-Schnittstelle verwenden Sie in Bugzilla? Ich bin der Autor der JSON-RPC-Schnittstelle, und ich kann mir keine Situation vorstellen, in der das passieren würde. Wenn dies die REST-API ist, ist das eine andere Geschichte - das ist ein separates Produkt, das getrennt verwaltet wird. –

+0

Es ist die REST-API, die ich verwende. –

Antwort

1

Gson erfordert benutzerdefinierte Deserialisierung für die Situation in der ursprünglichen Frage. Folgendes ist ein solches Beispiel.

input.json:

[ 
    { 
    "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 ""; 
    } 
} 

Ausgang:

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

verwenden stattdessen eine benutzerdefinierte d Eserializer für den Typ Thing.class wäre natürlich möglich. Dies hätte den Vorteil, keine zusätzliche Verarbeitung für jede String hinzuzufügen, aber dann würden Sie mit der "manuellen" Verarbeitung aller anderen Attribute von Thing feststecken.

0

Versuchen Sie, das Feld text als Object zu deklarieren. Dann tun Sie etwas wie:

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

Sie sollten dies als ein Bug für das Bugzilla-Projekt melden. Es gibt keinen guten Grund für dieses Verhalten.

+0

Wenn "Text" als Objekttyp deklariert wurde, würgt Gson immer noch auf "Text": {}, klagt, "Typinformation ist nicht verfügbar, und das Zielobjekt ist kein Primitiv: {}". –

Verwandte Themen