使用 Gson 解析后将嵌套的 JSON 数组插入 SQLite

Posted

技术标签:

【中文标题】使用 Gson 解析后将嵌套的 JSON 数组插入 SQLite【英文标题】:Insert a nested JSON array into SQLite after parsing with Gson 【发布时间】:2020-03-04 11:48:12 【问题描述】:

使用Gson 解析嵌套的JSON 数组后,我现在需要将结果插入SQLite。我尝试在不使用Gson 解析时按完成插入,但这不起作用。我想办法做到这一点,但找不到解决方案。

JSON 解析:

Gson gson = new Gson();
Type listType = new TypeToken<List<Country>>().getType();
List<Country> countriesList = gson.fromJson(jsonString, listType);
for(Country country : countriesList) 
    ContentValues insertValues;

如果我不使用 Gson,我会写这行:

JSONObject countryObject = countriesList.getJSONObject(country);

编辑

来自 JSON 的对象之一

[ 
    
      "name":"Afghanistan",
      "topLevelDomain":[ 
         ".af"
      ],
      "callingCodes":[ 
         "93"
      ],
      "capital":"Kabul",
      "region":"Asia",
      "subregion":"Southern Asia",
      "population":27657145,
      "latlng":[ 
         33.0,
         65.0
      ],
      "demonym":"Afghan",
      "area":652230.0,
      "gini":27.8,
      "timezones":[ 
         "UTC+04:30"
      ],
      "nativeName":"افغانستان",
      "numericCode":"004",
      "currencies":[ 
          
            "name":"Afghan afghani",
            "symbol":"؋"
         
      ],
      "languages":[ 
          
            "name":"Pashto",
            "nativeName":"پښتو"
         ,
          
            "name":"Uzbek",
            "nativeName":"Oʻzbek"
         ,
          
            "name":"Turkmen",
            "nativeName":"Türkmen"
         
      ],
      "translations": 
         "de":"Afghanistan",
      ,
      "flag":"https://restcountries.eu/data/afg.svg",
      "cioc":"AFG"
   ,

我写的模型类只针对我需要的变量对象和数组。

模型类 Country.Java

public class Country implements Parcelable 

    private String name;
    private String capital;
    private String region;
    private String subregion;
    private int population;
    private List<Double> latlng = new ArrayList<Double>();
    private double area;
    private double gini;
    private List<String> timezones = new ArrayList<String>();
    private List<Currency> currencies = new ArrayList<Currency>();
    private List<Language> languages = new ArrayList<Language>();
    private String flag;

    public Country() 

//getters, setters, toString() and Parcelable methods

模型类 Currency.Java

public class Currency implements Parcelable 

    private String name;
    private String symbol;

//getters, setters, toString() and Parcelable methods

模型类 Language.Java

public class Language implements Parcelable 

    private String name;
    private String nativeName;

//getters, setters, toString() and Parcelable methods

【问题讨论】:

你的数据库结构是什么? 添加 JSON 样本可以提供足够的信息? 【参考方案1】:

先获取Country的属性,然后放到内容值中插入。

List<Country> countries = gson.fromJson(jsonString, new TypeToken<List<Country>>().getType());

for(Country country : countries)   

    String name = country.getName();
    String capital = country.getCapital();
    String region = country.getRegion();
    String currencies = gson.toJson(country.getCurrencies());
    ...

    ContentValues insertValues = new ContentValues();  
    insertValues.put("name", name)
    insertValues.put("capital", capital);
    insertValues.put("region", region); 
    insertValues.put("currencies", currencies); 
    ...

    long res = db.insert(TABLE_NAME, null, insertValues); 


【讨论】:

你没有从中得到任何想法吗? 好像是这样。谢谢。 如果对您有帮助,请接受答案并按upvote。谢谢 你知道如何插入嵌套对象吗? 详细发帖告诉我链接【参考方案2】:

如果没有更多代码,很难知道问题出在哪里。您正在执行两种不同的操作:

    解组 json 在 SQLite 中保存数据。

使用 Gson 解组 json

在 for 循环中,您是否可以记录每个国家/地区以查看您正在获得一个设置了所有字段的有效对象?您很有可能需要自己创建工厂。 Country 是否有需要通过 RuntimeTypeAdapterFactory 注册的子类型?也许像

final RuntimeTypeAdapterFactory<City> typeFactory = RuntimeTypeAdapterFactory
  of(City.class, "MyCity")
  .registerSubtype(S...,...)

保存在 SQLite 中

一旦你有有效的数据,那么你必须像这样转换每个字段

public static ContentValues getContentValues(Country country) 
    ContentValues values = new ContentValues();
    values.put(COLUMN_ID, country.getId());
    values.put(COLUMN_NAME, country.getName());
    ...
    return values;

然后,如果它仍然不起作用,您将需要查看您的 SQLite 架构。

【讨论】:

这在评论中说得太多了,因此我将其输入为回复。所以也许这就是你所需要的。如果没有,我可以根据您的进展情况编辑此回复。

以上是关于使用 Gson 解析后将嵌套的 JSON 数组插入 SQLite的主要内容,如果未能解决你的问题,请参考以下文章

gson怎么解析数组和空数组?

使用gson解析怎么将json字符串解析为数组

Java泛型——使用Gson解析复杂的泛型嵌套泛型数据结构

使用Gson解析Json

gson 怎么处理 json数组字符串转list对象

关于解析各种复杂json