解析嵌套的 JSON 并将其保存到 SQLite 中,然后检索它

Posted

技术标签:

【中文标题】解析嵌套的 JSON 并将其保存到 SQLite 中,然后检索它【英文标题】:Parsing and saving a nested JSON into SQLite, and then retrieving it 【发布时间】:2020-03-04 08:36:51 【问题描述】:

编辑

我设法只插入了外部 JSON 对象。找不到有关如何插入嵌套对象的信息。每个对象中都有原始字段。这些对象可以在下面的 JSON 示例中看到:“语言”和“货币”。我还想知道如何处理外部 JSON 对象中的“latlng”数组,但最好一次处理这些问题。

我在外部 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 = new ContentValues();
      insertValues.put(Country.NAME, country.getName());
      //more insertions

原来的问题

我用 GSON 解析了一个嵌套的 JSON(可能是错误的,因为这是我第一次)。现在我正在尝试将其插入 SQLite。找不到接下来需要写的内容。当我为插入编写 for 循环时,我收到错误 cannot find symbol class Country。无法在网上找到相关的指导,所以我希望任何人都可以帮助如何前进。

这就是问题的开始:

Country[] countriesArray = gson.fromJson(jsonString, Country[].class);
for (int i = 0; i < countriesArray.length(); i++) 
...
            

countriesArray.length() 被标记为错误:找不到符号类 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

【问题讨论】:

类型 listType = new TypeToken>().getType();List countryList = gson.fromJson(jsonArray.toString(), listType);试试这个 我需要写县而不是“类型”?用什么代替“令牌”? 查看下面的答案 【参考方案1】:

创建一个 typeToken 并将其传递给 fromJson 方法,如下所示

Type listType = new TypeToken<List<Country>>().getType();
List<Country> countryList = gson.fromJson(jsonArray.toString(), listType);

【讨论】:

谢谢。插入 SQLite 是否与没有 Gson 的情况相同?例如:String name = countyList.getString("name");?【参考方案2】:

JSON解析时使用GsonTypeToken设置返回对象类型

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

for(Country country : countries) 
    //Do your DB operation here

【讨论】:

@Joe,我的解决方案错了吗?我先给了你解决方案,然后有人重复了相同的解决方案。这是嘲笑。

以上是关于解析嵌套的 JSON 并将其保存到 SQLite 中,然后检索它的主要内容,如果未能解决你的问题,请参考以下文章

遍历嵌套的json对象并将数据保存在android sqlite

Python - 如何解析 JSON 并将其保存到 MYSQL 数据库

使用 Dart 语言解析嵌套 JSON 数组并将其放入模型类中

如何拆分/解析 JSON 数据并将其保存到 SQL 服务器中?

将数据从列表视图(从 Rest Api 生成)传递到另一个活动并将其保存到 SQLite 数据库中

如何将复杂(嵌套)对象解析为 JSON 并在 Flutter 中使用 HTTP 将其发送到服务器?