【问题标题】:How to get JSONObject values in correct / listed order? [duplicate]如何以正确/列出的顺序获取 JSONObject 值? [复制]
【发布时间】:2014-04-11 06:03:20
【问题描述】:

我正在使用Iterator<String> _names = _formObject.keys(); 从以下 json 中获取值,但我得到的值没有按正确的顺序排列,例如我按“姓名、编号、电话、性别”的顺序获得,我怎样才能得到json 中的值是否正确?

{ "form" :{         
            "No" : {
                "type" : "text"
                  },
            "phone" : {
                "type" : "text"

            },
            "Name" : {
                "type" : "text"
            },
            "Sex" : {
                "type" : "radio"

             }
         }
       }

【问题讨论】:

  • 它基于您的回复。
  • JSON 没有对象成员键的顺序概念(RFC 7159,第 4 节)
  • @Achilles 我将我的 json 存储在我的文件存储中。然后只有我解析它。所以没有机会根据响应进行解析。

标签: java android json android-json


【解决方案1】:

JSON 对象中的键值对没有“正确顺序”。但是,如果您手动处理 JSON 读取器,您将读取序列化顺序 - 这种方法有效,因为流在​​ 之前被处理,它被 重构 为对象图(使用内部 JSONObject 的 Map)。

要访问 原始 JSON 阅读器,请参阅 JsonReader - 但是请注意,不保证任何 等效 JSON你得到的是按这个顺序提供的!虽然它“会起作用”,但它会基于一个(许多)等效 JSON 输出产生虚假的脆弱性。

When JsonObject's keys are iterated they aren't in the same order as in the response from the server中查看接受的答案:

JSON 对象的键顺序不应该是有意义的。 如果你想要一个特定的顺序,你应该使用一个数组,而不是一个对象

【讨论】:

    【解决方案2】:
    if(result != null)
            {
                try
                {
                    JSONObject jobj = result.getJSONObject("result");
    
                    String status = jobj.getString("status");
    
                    if(status.equals("true"))
                    {
                        JSONArray array = jobj.getJSONArray("data");
    
                        for(int x = 0; x < array.length(); x++)
                        {
                            HashMap<String, String> map = new HashMap<String, String>();
    
                            map.put("name", array.getJSONObject(x).getString("header"));
    
                            map.put("date", array.getJSONObject(x).getString("date"));
    
                            map.put("description", array.getJSONObject(x).getString("description"));
    
                            list.add(map);
                        }
    
                    }
                }
                catch (Exception e) 
                {
                    e.printStackTrace();
                }
            }
            else
            {
                Toast.makeText(Calendar.this, "Network Problem", Toast.LENGTH_LONG).show();
            }
    

    它正在从给定的 JSON 中读取

    {
    result: {
       data: [
      {
        header: "En övre rubrik här",
        date: "10 Apr,2014",
         description: "Test av en fin text. Om jag länkar. www.swerix.se Mer annat kanske.   0706300080 "
      },
      {
        header: "Info 3",
       date: "17 Apr,2014",
       description: "Detta är en ny information. Skrivet över även hej hopp"
      },
      {
      header: "testing news1",
      date: "13 Mar,2014",
      description: "this is testing news description12"
      }
      ],
      status: "true",
      description: "Data found"
    }
    

    【讨论】:

      【解决方案3】:

      你可以这样做-

      Iterator<String> _names  = _formObject.keys();
              while (_names.hasNext()) {
                  String key = _names.next();
                  try {
                      Object value = _formObject.get(key);
                      if(value.equals("No"))
                      { /*Do your stuff for No*/ }
      
                      if(value.equals("phone"))
                      { /*Do your stuff for phone*/ }
      
                      if(value.equals("Name"))
                      { /*Do your stuff for Name*/ }
      
                      if(value.equals("Sex"))
                      { /*Do your stuff for Sex*/ }
      
                  } catch (JSONException e) {
      
                  }
              }
      

      所以它们之前出现的顺序并不重要。您所要做的就是使用_formObject.get(key)检查您想要哪个键以哪个顺序。

      请注意,jsonObject 上的 keys() 函数不会按原样给出有序列表。 您必须按照建议以这种方式进行操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-07
        • 1970-01-01
        • 2011-11-19
        相关资源
        最近更新 更多