[英]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.