【问题标题】:Which is the best way to parse JSON data in Android?在 Android 中解析 JSON 数据的最佳方法是什么?
【发布时间】:2014-03-11 12:45:51
【问题描述】:

我有 JSON 数据要解析。结构不固定,有时以单个字符串形式出现,有时以数组形式出现。

目前,我们正在使用 GSON 库来解析 JSON,但是当它作为数组时遇到了问题。

例如:

1.  {"msg":"data","c":300,"stat":"k"}


2. {
    "msg": [
        " {\"id\":2,\"to\":\"83662\",\"from\":\"199878\",\"msg\":\"llll\",\"c\":200,\"ts\":1394536776}"
     ],
     "c": 200,
     "stat": "k",
     "_ts": 1394536776
 }

在上面的示例中,有时我将 msg 作为字符串,有时作为数组。

谁能帮助我?如果我决定使用 JSON 解析,那将非常繁琐,因为我有大约 20 多个 API 来解析,每个 API 至少包含 50 个字段。

【问题讨论】:

  • 你能控制你得到的 JSON 吗?在我看来,您需要将 JSON 标准化为始终为 "msg" :[] 并且数组的内容应该以某种方式指出它实际上只是一个字符串。
  • @user3064556 请参考下面我的回答以使用 Gson 库解析您的 json

标签: android json parsing gson


【解决方案1】:

您可以使用 JSONObjectJSONArray 类而不是 GSON 来处理 JSON 数据

第一个例子

String jsonStr = "{\"msg\":\"data\",\"c\":300,\"stat\":\"k\"}";

JSONObject jsonObj = new JSONObject(jsonStr);

String msg = jsonObj.getString("msg");
Integer c = jsonObj.getInteger("c");
String stat = jsonObj.getString("stat");

第二个例子

   String jsonStr = ... // "your JSON data";

   JSONObject jsonObj = new JSONObject(jsonStr);

   JSONArray jsonArr = jsonObj.getJSONArray("msg");

   JSONObject arrItem = jsonArr.getJSONObject(0);

   //and so on

JSONObject 类也有方法 opString、opArray,如果您尝试获取的数据不存在或类型错误,则不会抛出异常

例如

JSONArray arr = jsonObj.optJSONArray("msg");
JSONObject msg = null;
if (arr != null) {
    msg = arr.getJSONObject(0)
} else {
   msg = jsonObj.getJSONObject("msg");
}

【讨论】:

    【解决方案2】:

    您可以使用 Google GSON lib 直接将 json 解析为类对象。这既简单又准确。好吧,做一件事两者时间码不同,如果码是300直接解析json对象,不用GSON。如果代码为 200,则使用 GSON(定义类似的 java 类)

    String c= json.getString("c");
    if(c.equals("300")
    String message = status.getString("msg");
    

    【讨论】:

    • 好吧做一件事两者时间码不一样,如果码是300直接解析json对象不用GSON。如果代码为 200,则使用 GSON(定义类似的 java 类)
    • 好的..谢谢。让我试试这个
    【解决方案3】:

    有两种方式来解析 JSON。

    1. 手动使用Android OS JSON Parser Android JSON Parsing And Conversion
    2. 使用 GSON 库 [库] (https://code.google.com/p/google-gson/downloads/list)。如果你知道 json 响应的所有参数和模型,这很容易处理。

    【讨论】:

      【解决方案4】:

      参考下面的代码 sn-p 使用 Google 的 Gson 库反序列化您的 json,无一例外。

      String jsonStr = "your json string ";
      
      Gson gson = new Gson();
      JsonObject jsonObj = gson.fromJson (jsonStr, JsonElement.class).getAsJsonObject();
      
      JsonElement elem = jsonObj.get("msg");
      
      if(elem.isJsonArray()) { //**Array**
         ArrayList<MyMessage> msgList = gson.fromJson(elem.toString(), new TypeToken<List<MyMessage>>(){}.getType());
      } else if(elem.isJsonObject()) { //**Object**
         Note note = gson.fromJson(elem.toString(), MyMessage.class);
      } else {  //**String**
         String note = elem.toString();
      }
      

      MyMessage 类

      public class MyMessage {
         String to;
         String from;
         String msg;
         int id;
         int c;
         long ts;
      
         // Setters and Getters
      }
      

      【讨论】:

        猜你喜欢
        • 2022-01-06
        • 1970-01-01
        • 1970-01-01
        • 2019-09-16
        • 2012-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多