我编写了一个程序,该程序进行了一些概率计算,并以数组形式给出其结果。我想将这些结果转换为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"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我所了解的是,我需要一个具有对象结构的对象类。目前,我仅在试验rank对象,但未能形成所需的JSON。
我的对象结构代码:
public class Object {
int rank_;
public class Inner{
String Source;
String Destination;
String Weightage;
}
}
Run Code Online (Sandbox Code Playgroud)
我可以将方法的一个实例Object或方法的一个实例传递Inner给toJson()get {"rank_":1}或{"Source":"ABC","Destination":"XYZ","Weightage":"123"}。我似乎无法将每个内部对象放入相应的等级对象。
我这样做相对容易,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;
}
Run Code Online (Sandbox Code Playgroud)
好吧,首先:相关的对象可能应该一起在一个类中。让我们从一个简单的类开始:
public class Results {
int mkr;
String[][] result;
}
Run Code Online (Sandbox Code Playgroud)
现在我们想要将其序列化。我们可以构建不同的数据结构,或者我们可以编写自己的自定义序列化器。我们希望我们的自定义类允许我们使用 的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();
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过执行以下操作来调用此方法(注意:应该只创建Gson对象一次,但我这样做是为了保持代码简短):
public String convertToJson(Results results) {
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(new ResultsAdapter()):
Gson gson = builder.build();
return gson.toJson(results);
}
Run Code Online (Sandbox Code Playgroud)
这将按照您要求的方式工作,但我强烈建议您使用JSON 的数组语法(使用[])。试试这个:
public String convertToJson(Results results) {
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(new ResultsAdapter()):
Gson gson = builder.build();
return gson.toJson(results);
}
Run Code Online (Sandbox Code Playgroud)
这样做将产生如下所示的 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();
}
Run Code Online (Sandbox Code Playgroud)