2014-04-14 5 views
11

Ich verwende GSON, um ein SugarRecord Objekt aus einer JSON-Antwort zu erstellen. Die API, die ich verwende, gibt ein Feld namens "id" zurück, aber der Typ von "id" ist eine Zeichenfolge, nicht lang (das Backend verwendet Mongo).Parsen einer String-ID mit SugarORM und GSON

Unten ist der Code, ich verwende:

Gson gson = new Gson(); // Or use new GsonBuilder().create(); 
NutritionPlan target = gson.fromJson(jsonObject.getJSONObject("nutrition_day").toString(), NutritionPlan.class); 

unten meine Json Antwort:

{ 
"nutrition_day": { 
    "id": "5342b4163865660012ab0000", 
    "start_on": "2014-04-08", 
    "protein_target": 157, 
    "sodium_limit": 2000 
} 

Gibt es einen guten Weg, um dieses Szenario zu behandeln? Ich habe versucht,

@Ignore 
long id; 

und

@SerializedName("id") 
String nutrition_plan_id; 

in meinem Modell, aber keiner half. Jemand vertraut mit Sugar ORM, und wissen, wie man mit einem id Feld, das nicht lange ist, umzugehen?

+0

Warum nehmen Sie keine 'lange ID' aus Ihrem Modell? – CQM

+0

versuchte das. Der lange Typ der ID stammt automatisch von SugarRecord. Ich versuche, es zu überschreiben und ändern Sie es in eine Zeichenfolge – coder

Antwort

0

Ich habe mich mit dem gleichen Problem beschäftigt, und die einzige Lösung, die ich gefunden habe, war, den ID-Namen von meiner API umzubenennen. Von Beispiel versuchen Sie, nutrition_plan_id anstelle von id von Ihrer API zu senden, und es würde die Arbeit erledigen.

+1

Das einzige Problem ist, ich verwende eine API von Drittanbietern, so dass ich die ID nicht ändern kann. – coder

0

Hier ist meine Lösung, aber es wird nicht die beste sein.

Ich ignorierte id nur in meinem Feed

public class Feed extends SugarRecord<Feed> { 

    @Expose int idMember; 
} 

Es funktioniert gut, aber die wirkliche id ist nicht mehr verwendet.

4

Ersetzen Sie den Schlüssel "ID" in der Zeichenfolge zu "Nutrition_day_id". Sie können die ID json und die ID sql verwenden.

jsonObject.getJSONObject("nutrition_day").toString().replace("\"id\"","\"nutrition_day_id\"") 
1

Es half mir id Namen mid und Annotation @Expose zu allen Bereichen, die und Annotation @SerializedName neue id Feld hinzufügen serialisiert werden müssen hinzufügen zu ändern.

@SerializedName("id") 
@Expose 
private final String mid; 

@Expose 
private final String street; 
0

Ich suchte nach einer Lösung für dieses Problem für einige Zeit. Endlich habe ich eine Lösung gefunden. Fügen Sie der gewünschten Klasse einfach @Table Annotation hinzu, statt sie von SugarRecord zu erweitern, und fügen Sie manuell das Attribut id hinzu. Sie können es aus der Gson-Serialisierung über das Schlüsselwort ausschließen oder es mit @SerializedName Annotation umbenennen.

Beispiel (funktioniert für mich auf SugarOrm v1.4 fein):

@Table 
public class MySugarOrmClass{ 

    @SerializedName("db_id") 
    private transient Long id = null; 

    @SerializedName("id") 
    private Integer aid; 

    // Add an empty constructor 
    public MySugarClass(){} 


    //Other fields and class attributes 
    ... 
} 

Aber das bedeutet, dass Sie nicht .save(), .delete() verwenden können usw. Methoden dieser Klasse. Stattdessen müssen Sie die statischen Methoden von SugarRecord verwenden: SugarRecord.save(), SugarRecord.delete(), ...