Разбор строки с помощью SugarORM и GSON

Я использую GSON для создания объекта SugarRecord из json-ответа. API, который я использую, возвращает поле с именем "id", но тип "id" является строкой, а не длинной (бэкэнд использует mongo).

Ниже приведен код, который я использую:

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

Ниже мой ответ json:

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

Есть ли хороший способ справиться с этим сценарием? Я попробовал

@Ignore 
long id;

и

@SerializedName("id")
String nutrition_plan_id;

в моей модели, но ни одна из них не помогла. Любой, кто знаком с Sugar ORM и знает, как иметь дело с полем id, которое не является длинным?

Ответ 1

Замените ключ "id" в строке, чтобы быть "nutrition_day_id". Вы можете использовать id json и id sql.

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

Ответ 2

Это помогло мне изменить имя id на mid и добавить аннотацию @Expose ко всем полям, которые должны быть сериализованы, и добавить аннотацию @SerializedName в новое поле id.

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

@Expose
private final String street;

Ответ 3

Я был обеспокоен той же проблемой, и единственным решением, которое я нашел, было переименование имени id из моего API. Из примера попробуйте отправить nutrition_plan_id вместо id из вашего API, и он выполнил бы эту работу.

Ответ 4

Вот мое решение, но оно не будет лучшим.

Я просто проигнорировал id в своем канале

public class Feed extends SugarRecord<Feed>  {

  @Expose int idMember;
}

Он отлично работает, однако реальный id больше не используется.

Ответ 5

Я искал решение этой проблемы в течение довольно долгого времени. Наконец я нашел решение. Просто добавьте аннотацию @Table к нужному классу вместо того, чтобы расширять его с SugarRecord и вручную добавить атрибут id. Вы можете исключить его из сериализации Gson с помощью ключевого слова transient или/и переименовать его с помощью аннотации @SerializedName.

Пример (отлично работает для меня на SugarOrm v1.4):

@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
    ...
}

Но это означает, что вы не можете использовать методы .save(), .delete() и т.д. этого класса. Вместо этого вы должны использовать статические методы SugarRecord: SugarRecord.save(), SugarRecord.delete(),...