簡體   English   中英

如何使用 Gson 制作嵌套的 JSON 對象?

[英]How do I make nested JSON Objects using Gson?

我編寫了一個程序來進行一些概率計算並以數組的形式給出其結果。 我想將這些結果轉換為 JSON 格式,但我遇到了問題。

我希望我的 json 對象看起來像這樣:

{
    "totalSuggestions": 6,
    "routes": {
        "rank_2": {
            "Source": "ABC",
            "Weight": "0.719010390625",
            "Destination": "XYZ"
        },
        "rank_1": {
            "Source": "XYZ",
            "Weight": "0.7411458281249999",
            "Destination": "ABC"
        },
        "rank_0": {
            "Source": "LMN",
            "Weight": "0.994583325",
            "Destination": "PQR"
        }
     }
}   

我的理解是,我需要一個包含對象結構的對象類。 現在我只試驗 rank 對象,但未能形成所需的 JSON。

我的對象結構代碼:

public class Object {
    int rank_;

    public class Inner{
        String Source;
        String Destination;
        String Weightage;
    }
}

我可以將Object的實例或Inner的實例傳遞給toJson()方法,因此我可以得到{"rank_":1}{"Source":"ABC","Destination":"XYZ","Weightage":"123"} 我似乎無法將每個內部對象放到相應的等級對象中。

我使用org.json相對輕松地org.json但該庫在 Android Studio 中存在一些問題,因此我不得不切換到 Gson。 我之前所做的(也有效)是:

public JSONObject convertToJson(int mkr, String[][] result){
    JSONObject outerObj = new JSONObject();
    JSONObject innerObj = new JSONObject();
    JSONObject[] temp = new JSONObject[mkr];
    outerObj.put("totalSuggestions", marker); 
    outerObj.put("routes",innerObj);

    for (int i=0;i<marker;i++){ 
       String[] useless = result[i][0].split("-"); 
       temp[i]= new JSONObject();
       temp[i].put("Source",useless[0] );
       temp[i].put("Destination", useless[1]);
       temp[i].put("Weight", result[i][1]);
       innerObj.put("rank_"+i, temp[i]);
    }
    System.out.println(outerObj.toString());
    return outerObj;
}

嗯,首先:相關的對象可能應該一起在一個類中。 所以讓我們從一個簡單的類開始:

public class Results {
  int mkr;
  String[][] result;
}

現在我們要序列化它。 我們可以構建不同的數據結構,或者我們可以編寫自己的自定義序列化程序。 我們希望有我們的自定義類來允許我們使用Gson的類型推斷來這樣做,而且代碼更容易理解。 我將向您展示如何序列化數據結構,並將反序列化留給您作為練習。

我們創建一個TypeAdapter<Results>

public class ResultsAdapter extends TypeAdapter<Results> {
  public Results read(JsonReader reader) throws IOException {
    if (reader.peek() == JsonToken.NULL) {
      reader.nextNull();
      return null;
    }
    // exercise for you
    return results;
  }
  public void write(JsonWriter writer, Results value) throws IOException {
    if (value == null) {
      writer.nullValue();
      return;
    }
    writer.beginObject();
    writer.name("totalSuggestions").value(value.mkr);
    writer.name("routes");
    writer.beginObject();
    for(int i = 0; i < value.mkr; i++) {
       writer.name("rank_"+i);
       writer.beginObject();
       String[] sourceDestSplit = result[i][0].split("-"); 
       writer.name("Source").value(sourceDestSplit[0]);
       writer.name("Destination").value(sourceDestSplit[1]);
       writer.name("Weight").value(result[i][1]);
       writer.endObject();
    }
    writer.endObject();
    writer.endObject();
  }
}

然后你可以通過執行調用這個方法(注意:應該只創建一次Gson對象,但我這樣做是為了保持代碼簡短):

public String convertToJson(Results results) {
   GsonBuilder builder = new GsonBuilder();
   builder.registerTypeAdapter(new ResultsAdapter()):
   Gson gson = builder.build();

   return gson.toJson(results);
}

這將按照您要求的方式工作,但我強烈建議您改用JSON 的數組語法(使用[] )。 試試這個:

  public void write(JsonWriter writer, Results value) throws IOException {
    if (value == null) {
      writer.nullValue();
      return;
    }
    writer.beginObject();
    writer.name("totalSuggestions").value(value.mkr);
    writer.name("routes");
    writer.beginArray();
    for(int i = 0; i < value.mkr; i++) {
       writer.beginObject();
       String[] sourceDestSplit = result[i][0].split("-"); 
       writer.name("Source").value(sourceDestSplit[0]);
       writer.name("Destination").value(sourceDestSplit[1]);
       writer.name("Weight").value(result[i][1]);
       writer.endObject();
    }
    writer.endArray();
    writer.endObject();
  }

這樣做將導致 JSON 看起來像這樣,這將更容易在另一端反序列化和迭代,因為您不必為鍵動態生成映射。:

{
  "totalSuggestions": 6,
  "routes": [
    {
        "Source": "ABC",
        "Weight": "0.719010390625",
        "Destination": "XYZ"
    },
    {
        "Source": "XYZ",
        "Weight": "0.7411458281249999",
        "Destination": "ABC"
    },
    {
        "Source": "LMN",
        "Weight": "0.994583325",
        "Destination": "PQR"
    }
  ]
}   

我在為com.google.gson.JsonObject庫搜索類似解決方案時來到這里。 現在,我找到了:

JsonObject mainJson = new JsonObject();
JsonObject innerJson = new JsonObject();

innerJson.addProperty("@iot.id", "31");
mainJson.add("Datastream", innerJson);  // <-- here the nesting happens
mainJson.addProperty("result", 12.3);

// fetch inner variable like this
System.out.println(mainJson.get("Datastream").getAsJsonObject().get("@iot.id").getAsString());

這對我使用com.google.gson.JsonObject庫很有效。

為了記錄,這就是我所做的。

import java.util.*;


public class DataObject {

public int Suggestions;
HashMap<String, route> routes = new HashMap<>();

    //constructor
    public DataObject(int mkr, String[][] routesArr){
        Suggestions = mkr;
        { 
            for (int i=0;i<Suggestions;i++){
                routes.put("rank_"+(i+1),new route(routesArr[i]));
            }
        }
    }     
//class to populate the hashmap
public class route{
    public String Origin;
    public String Destination;
    public String Weight; 


public route(String arr[]){
    String[] splitter = arr[0].split("-");
    this.Origin = splitter[0];
    this.Destination = splitter[1];
    this.Weight = arr[1];
}     

}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM