Gson 使用 proguard 在 android 上解析
Gson parsing on android with proguard
我只有在使用 proguard 时才会遇到 Gson 的解析问题。在没有混淆器的调试模式和发布模式下,一切正常。
这是我的 json 字符串:
{"tables":[{"name":"Profile","columns":[{"label":"id","type":"text","primary":true},{"label":"name","type":"text"},{"label":"age","type":"integer"},{"label":"human","type":"integer"},{"label":"gear","type":"Gear","custom":true,"list":true}]},{"name":"Gear","columns":[{"label":"id","type":"text","primary":true},{"label":"type","type":"text","enum":true},{"label":"name","type":"text"},{"label":"id_Profile","type":"integer","foreign_key":true}]},{"name":"Animal","columns":[{"label":"id","type":"text","primary":true},{"label":"name","type":"text"},{"label":"magic","type":"integer"},{"label":"id_Profile","type":"integer","foreign_key":true}]}]}
这些是我的 POJO :
public class Database {
private List<Table> tables;
public List<Table> getTables() {
return tables;
}
public void setTables(List<Table> tables) {
this.tables = tables;
}
}
public class Table {
private String name;
private List<Column> columns;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Column> getColumns() {
return columns;
}
public void setColumns(List<Column> columns) {
this.columns = columns;
}
}
我读取了包含 json 字符串的文件并以这种方式解析它:
public Database getDatabase(Context context) throws IOException {
InputStream stream = context.getAssets().open(PATH);
String schema = getJsonSchema(stream);
Gson gson = new Gson();
return gson.fromJson(schema, Database.class);
}
但是当我尝试从我的 Database
对象调用方法 getTables()
时:
for (Table table : database.getTables()) {
//...
}
我收到此错误:java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference
。我已经将那些 rules 包含在混淆器中。知道是什么原因吗?
正如达尔文评论的那样,将 @Keep
注释添加到我的 POJO 类 解决了问题
我只有在使用 proguard 时才会遇到 Gson 的解析问题。在没有混淆器的调试模式和发布模式下,一切正常。
这是我的 json 字符串:
{"tables":[{"name":"Profile","columns":[{"label":"id","type":"text","primary":true},{"label":"name","type":"text"},{"label":"age","type":"integer"},{"label":"human","type":"integer"},{"label":"gear","type":"Gear","custom":true,"list":true}]},{"name":"Gear","columns":[{"label":"id","type":"text","primary":true},{"label":"type","type":"text","enum":true},{"label":"name","type":"text"},{"label":"id_Profile","type":"integer","foreign_key":true}]},{"name":"Animal","columns":[{"label":"id","type":"text","primary":true},{"label":"name","type":"text"},{"label":"magic","type":"integer"},{"label":"id_Profile","type":"integer","foreign_key":true}]}]}
这些是我的 POJO :
public class Database {
private List<Table> tables;
public List<Table> getTables() {
return tables;
}
public void setTables(List<Table> tables) {
this.tables = tables;
}
}
public class Table {
private String name;
private List<Column> columns;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Column> getColumns() {
return columns;
}
public void setColumns(List<Column> columns) {
this.columns = columns;
}
}
我读取了包含 json 字符串的文件并以这种方式解析它:
public Database getDatabase(Context context) throws IOException {
InputStream stream = context.getAssets().open(PATH);
String schema = getJsonSchema(stream);
Gson gson = new Gson();
return gson.fromJson(schema, Database.class);
}
但是当我尝试从我的 Database
对象调用方法 getTables()
时:
for (Table table : database.getTables()) {
//...
}
我收到此错误:java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference
。我已经将那些 rules 包含在混淆器中。知道是什么原因吗?
正如达尔文评论的那样,将 @Keep
注释添加到我的 POJO 类 解决了问题