【问题标题】:parsing json using Gson which has objects with same field name使用具有相同字段名称的对象的 Gson 解析 json
【发布时间】:2015-12-08 06:50:13
【问题描述】:

我有一个 json 文件,其结构如下:

{
"Otions": true
"Plastic": ""
"Houses": {
   7: {
   "name": "Akash Bhawan"
   "MemBers": 3
   "children": 1
   }-
   8: {
   "name": "Ashiyana"
   "memBers": 4
   "children": 2
   }-
   9: {
  "name": "Faruks Nest"
  "memBers": 5
  "children": 1
  }-

房屋内的物体是可变的,可以相应地增加或减少,也可以改变名称。 字段“name”、“members”、“children”是唯一的字段并且永远存在

我正在使用gson来解析

@SerializedName("Otions")
private String Options;
@SerializedName("Plastic")
private String plastics;
@SerializedName("Houses")
private Houses houses;

我想知道是否有一种方法可以将不同命名的对象存储在哈希表或其他方式中?

【问题讨论】:

  • 您可以查看JSONObjectnames()keys() 方法。我不记得哪个拿到你的钥匙(在你的情况下是“8”和“9”)。
  • 看看这个SO Thread

标签: java android json gson


【解决方案1】:

如果你不能改变结构,那么你必须把房子从int 变成Hashmapobject。例如:-

HashMap<int, Object> House;

该对象将包含名称、成员、详细信息等元素。

【讨论】:

  • 你的意思是 JSONObject 而不是 Object ?我无法想象一个对象有没有类型的元素
  • @Prim 的意思是用该类的这三个元素和对象创建一个类。
  • @TusharSaha 之所以有效,是因为上面有键值对,其中键是 7,8, 9 是整数,值是 { "name": "Akash Bhawan", "MemBers": 3 , "children": 1 } 这是一个对象,就这么简单。
  • @TusharSaha 即使您想使用不必要的类似 HashMap 的解决方案,我建议您使用 SparseArray。这样可以避免自动装箱。
【解决方案2】:

房屋应该是这样的地图。

私有 HashMap 房屋。

从 3: 开始表示索引结构。 Gson 将根据需要创建嵌套对象。

【讨论】:

  • 列表或数组无法工作,因为其中有对象
  • hashmap 中的 key 和 value 应该是什么
  • '3' 是键,“House”-object 将是值。这将由 GSON 插入。
【解决方案3】:

请把“房子”做成一堆数组而不是对象。

{
    "Options": true,
    "Plastics": "",
    "house": [{
        "name": "Akash Bhawan",
        "MemBers": 3,
        "children": 1
    }, {
        "name": "Ashiyana",
        "memBers": 4,
        "children": 2
    }, {
        "name": "Faruks Nest",
        "memBers": 5,
        "children": 1
    }]
}

【讨论】:

  • 我无法改变json的结构
  • 它来自后端我无法更改它
【解决方案4】:

您应该执行以下操作(如我的评论中所述):

JSONObject jsonHouses = jsonObject.getJSONObject("Houses");
Iterator<String> keys = jsonHouses.keys(); //this will be array of "7", "8", "9"

if (keys.hasNext()) {
    JSONObject singleHouseObject = jsonHouses.getJSONObject(keys.next());
    //now do whatever you want to do with singleHouseObject.
    //this is the object which has "name", "MemBers", "children"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多