GSON。如何将json对象转换为json数组?

Posted

技术标签:

【中文标题】GSON。如何将json对象转换为json数组?【英文标题】:GSON. How to convert json object to json array? 【发布时间】:2016-05-07 03:13:34 【问题描述】:

现在我从 API 获取这个 JSON:

"supplyPrice": 
        "CAD": 78,
        "CHF": 54600.78,
        "USD": 20735.52
      

但价格是动态的,这就是我需要这种形式的 JSON 的原因


  "supplyPrice": [
    
      "name": "CAD",
      "value": "78"
    ,
    
      "name": "TRY",
      "value": "34961.94"
    ,
    
      "name": "CHF",
      "value": "54600.78"
    ,
    
      "name": "USD",
      "value": "20735.52"
    
  ]

如何使用 GSON 做到这一点?

【问题讨论】:

如果我正确理解您的问题,您可能会收到 JsonObject 或 JsonArray。您可以调用 getAsJsonObject() 方法,如果失败,请调用 getAsJsonArray()。 或者使用isJsonObject()方法,根据结果调用getAsJsonObject()或者getAsJsonArray()。 【参考方案1】:

您可以直接将其转换为HashMap or TreeMap,然后浏览您的地图以查找所有键。

这将是实现您想要的最简单的方法。

【讨论】:

【参考方案2】:

您需要迭代 supplyPrice 对象的所有键,并使用该键值创建新 JSONArray,然后将新数组分配给 supplyPrice 键

JSONObject changeSupplyPrice(JSONObject JSONObj)
    try 
        JSONObject supplyPrice =JSONObj.getJSONObject("supplyPrice");
        JSONArray supplyPriceArray = new JSONArray();
        Iterator<?> keys = supplyPrice.keys();

        while( keys.hasNext() ) 
            String key = (String)keys.next();
            Log.e("JSON Array key",key);
            supplyPriceArray.put(new JSONObject(""+key+":"+supplyPrice.getString(key)+""));

        
        JSONObj.put("supplyPrice", supplyPriceArray);
        return JSONObj;
     catch (JSONException e) 
        e.printStackTrace();
    
    return null;

然后调用你想要的函数

try 
        JSONObject JSONObj = new JSONObject("'taxes': [],'name': 'Laboriosam iusto eum','requiresShipping': false,  'taxable': true,  'sku': 'QBA84J18832',  'product': 12, 'supplyPrice':     'CAD': 78,   'CHF': 54600.78,    'USD': 20735.52  ");
        JSONObj = changeSupplyPrice(JSONObj);
        Log.e("Return JSON Object",JSONObj.toString());
     catch (JSONException e) 
        e.printStackTrace();
    

【讨论】:

【参考方案3】:

希望这部分代码对你有所帮助:

    String json = "\"supplyPrice\": \n" +
            "        \"CAD\": 78,\n" +
            "        \"CHF\": 54600.78,\n" +
            "        \"USD\": 20735.52\n" +
            "      ";

    Gson gson = new Gson();
    JsonObject jsonObject = gson.fromJson(json, JsonObject.class);
    JsonObject supplyPrice = jsonObject.get("supplyPrice").getAsJsonObject();
    Type type = new TypeToken<HashMap<String, Double>>() 
    .getType();
    HashMap<String, Double> parsedJson = gson.fromJson(supplyPrice, type);
    JsonArray jsonArray = new JsonArray();
    for(String key : parsedJson.keySet()) 
        JsonObject jo = new JsonObject();
        jo.addProperty("name", key);
        jo.addProperty("value", parsedJson.get(key));
        jsonArray.add(jo);
    
    JsonObject result = new JsonObject();
    result.add("supplyPrice", jsonArray.getAsJsonArray());

【讨论】:

【参考方案4】:

GSON 使用 POJO 类将 JSON 解析为 java 对象。

创建一个 java 类,其中包含名称和数据类型与 JSON 对象的键相同的变量。我认为您得到的 JSON 格式不正确。

Class SupplyPrice
 double CAD;
 double CHF;
 double TRY


Class SupplyPriceContainer
 ArrayList<SupplyPrice> supplyPrice;

你的 JSON 应该是

 
    "CAD": 78,
    "CHF": 54600.78,
    "USD": 20735.52
 




    "supplyPrice": [
        "CAD": 78,
        "CHF": 0,
        "USD": 0
    , 
        "CAD": 0,
        "CHF": 54600.00,
        "USD": 0
    , 
        "CAD": 0,
        "CHF": 0,
        "USD": 20735.52
    ]
 

然后就可以使用GSON的`fromJson(String pJson, Class pClassType) 转换成JAVA对象了

  Gson gson = new Gson()
  ArrayList<SupplyPrice> suplyPrices = gson.fromJson(pJsonString, SupplyPrice.class);

现在可以使用arraylist来获取数据了。

【讨论】:

【参考方案5】:

看看这个..可能会对你有所帮助。

 JSONObject json= json.getJSONObject("supplyPrice");
    Iterator i = json.keys();
    JSONArray jsonArray = new JSONArray();

    while (i.hasNext())
        String key = (String) i.next();
        jsonArray.put(json.get(key));

【讨论】:

【参考方案6】:

感谢 Rohit Patil!我根据我的情况修改了他的代码,它可以工作!

private JSONObject modifyPrices(JSONObject JSONObj) 
    try 
        JSONObject supplyPrice = JSONObj.getJSONObject("supplyPrice");
        JSONArray supplyPriceArray = new JSONArray();
        Iterator<?> keys = supplyPrice.keys();
        while (keys.hasNext()) 
            String key = (String) keys.next();
            String value = supplyPrice.getString(key);
            supplyPriceArray.put(new JSONObject("\"name\":" + key + ",\"value\":" + value + ""));
        
        JSONObj.put("supplyPrice", supplyPriceArray);
        return JSONObj;
     catch (JSONException e) 
        e.printStackTrace();
    
    return null;

【讨论】:

【参考方案7】:

我们只需要一行代码就可以将 jsonObjects 转换为数组(不是 jsonArrays,但在将其设为 arrayList 后,您也可以轻松创建 jsonArray。)

fun <LIST_TYPE>jsonObjectToArray(jsonObject : JsonObject,listTypeClass : Class<LIST_TYPE>) = arrayListOf<LIST_TYPE>().apply  jsonObject.keySet().forEach  this.add(Gson().fromJson(jsonObject.get(it).toString(),listTypeClass))

【讨论】:

以上是关于GSON。如何将json对象转换为json数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 的 Kotlin 中使用 GSON 将 JSON 对象转换为 JSON 数组

如何使用 GSON 将 List 转换为 JSON 对象?

让复杂Json数据和对象自由转换 --- Gson

如何将Java对象转换为JSON(Gson)?

java中如何将对象转成json格式字符串

如何在android中把JSON对象转换为string