Ответ 1
Замените ключ "id" в строке, чтобы быть "nutrition_day_id". Вы можете использовать id json и id sql.
jsonObject.getJSONObject("nutrition_day").toString().replace("\"id\"","\"nutrition_day_id\"")
Я использую 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
, которое не является длинным?
Замените ключ "id" в строке, чтобы быть "nutrition_day_id". Вы можете использовать id json и id sql.
jsonObject.getJSONObject("nutrition_day").toString().replace("\"id\"","\"nutrition_day_id\"")
Это помогло мне изменить имя id
на mid
и добавить аннотацию @Expose
ко всем полям, которые должны быть сериализованы, и добавить аннотацию @SerializedName
в новое поле id
.
@SerializedName("id")
@Expose
private final String mid;
@Expose
private final String street;
Я был обеспокоен той же проблемой, и единственным решением, которое я нашел, было переименование имени id из моего API. Из примера попробуйте отправить nutrition_plan_id вместо id из вашего API, и он выполнил бы эту работу.
Вот мое решение, но оно не будет лучшим.
Я просто проигнорировал id
в своем канале
public class Feed extends SugarRecord<Feed> {
@Expose int idMember;
}
Он отлично работает, однако реальный id
больше не используется.
Я искал решение этой проблемы в течение довольно долгого времени. Наконец я нашел решение. Просто добавьте аннотацию @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()
,...