我想将某些类型为ParentClass的字段作为json字符串存储到我的数据库中。我不想使用Serializable接口和DataType.SERIALIZABLE导致它与序列化类的完整类名相关联。
所以我正在使用以下代码:
class ParentClass {
@DatabaseField(persisterClass = MyFieldClassPersister.class)
private MyFieldClass myField;
}
持久性类的一种:
public class MyFieldClassPersister extends StringType {
private static final MyFieldClassPersister singleTon = new MyFieldClassPersister();
public static MyFieldClassPersister getSingleton() {
return singleTon;
}
protected MyFieldClassPersister() {
super(SqlType.STRING, new Class<?>[0]);
}
@Override
public Object parseDefaultString(FieldType fieldType, String defaultStr) {
return jsonStringToObject(defaultStr);
}
@Override
public Object resultToSqlArg(FieldType fieldType, DatabaseResults results, int columnPos) throws SQLException {
String string = results.getString(columnPos);
return jsonStringToObject(string);
}
private static MyFieldClass jsonStringToObject(String string) {
// json to object conversion logic
}
}
这是我遇到的两个问题:
我没有得到如何指定从对象到字符串的自定义转换的信息。似乎ORMLite调用Object.toString()以获得对象的字符串表示形式。在Persister中有一些方法非常好,我可以在其中指定如何将Object转换为字符串(在我的情况下为json)。是的,我可以在MyFieldClass中重写toString()方法,但是在Persister中执行转换更为方便。为了指定从模型对象到db-object的转换,我可以重写任何方法吗?
如果我将自定义字段类型标记为String类型:
class ParentClass {
@DatabaseField(dataType = DataType.STRING, persisterClass = MyFieldClassPersister.class)
private MyFieldClass myField;
}
然后使用以下消息保存对象时ormlite崩溃:
java.lang.IllegalArgumentException: Field class com.myapp.venue.MyFieldClass for
field FieldType:name=myField,class=ParentClass is not valid for type
com.j256.ormlite.field.types.StringType@272ed83b, maybe should be
class java.lang.String
如果我省略dataType规范,它不会崩溃。我可以以某种方式避免这种崩溃吗?在我看来,最好明确地指定类型。
因此,基本上,您的持久化器应以以下方式实现:
public class MyFieldClassPersister extends StringType {
private static final MyFieldClassPersister INSTANCE = new MyFieldClassPersister();
private MyFieldClassPersister() {
super(SqlType.STRING, new Class<?>[] { MyFieldClass.class });
}
public static MyFieldClassPersister getSingleton() {
return INSTANCE;
}
@Override
public Object javaToSqlArg(FieldType fieldType, Object javaObject) {
MyFieldClass myFieldClass = (MyFieldClass) javaObject;
return myFieldClass != null ? getJsonFromMyFieldClass(myFieldClass) : null;
}
@Override
public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) {
return sqlArg != null ? getMyFieldClassFromJson((String) sqlArg) : null;
}
private String getJsonFromMyFieldClass(MyFieldClass myFieldClass) {
// logic here
}
private MyFieldClass getMyFieldClassFromJson(String json) {
// logic here
}
}
您应该在onCreate
您的OrmLiteSqliteOpenHelper
课堂方法中注册它
@Override
public void onCreate(SQLiteDatabaseHolder holder, ConnectionSource connectionSource) {
try {
//...
DataPersisterManager
.registerDataPersisters(MyFieldClassPersister.getSingleton());
} catch (SQLException e) {
// log exception
}
}
然后可以在模型中使用它,如下所示:
@DatabaseField(persisterClass = MyFieldClassPersister.class, columnName = "column_name")
protected MyFieldClass myFieldClass;
问题内容: 确定,所以我编辑了问题,因为它不够清楚。 编辑2 :更新了JSON文件。 我在Android应用程序中使用GSON,我需要解析来自服务器的JSON文件,这些文件有点太复杂了。我不想让我的对象结构太沉重,所以我想简化内容: 所以我的对象的结构将不是JSON文件的结构。 例如,如果在JSON中,我有以下内容: 我不想保留我当前的对象结构,即一个对象,其中包含一个和一个“总计”。但是我只想将
我想以 json 格式序列化一个自定义对象,其中 entryData 是我的域对象的列表。像这样: 下面是我在一次尝试中为获得json输出所做的工作: 但结果是entryData评估为字符串,引号转义: 我也尝试过这样做: 但是我得到了这个例外:
问题内容: 我正在使用Jersey为服务器组件创建REST Web服务。 我要在列表中序列化的带有JAXB注释的对象如下所示: 我有一个REST资源来检索一个看起来像这样的发行版: 我还有一个REST资源来检索所有发行版的列表,如下所示: 我使用ContextResolver自定义JAXB序列化,当前配置如下: REST资源和上下文解析器都可以使用。这是第一个输出的示例: 这正是我想要的。这是列表
我有下面的JSON,我正试图使用Jackson API反序列化它 我基本上需要一个附件类,它有一个AttachmentFile对象列表,如下所示: 如何使用自定义反序列化器实现这一点? 谢谢
我使用NewtonSoft.json来反序列化这个json
问题内容: 我正在尝试将自己的自定义对象传递到包中: 我得到错误: 问题答案: 一种方法是让您的自定义对象实现Parcelable接口并使用