使用SDK在创建ZStack的工单的时候,要求传入一个list,而前端json传入的是这样的。
"requests": [
{
"requestName": "create vm",
"apiName": "org.zstack.header.vm.APICreateVmInstanceMsg",
"executeTimes": 1.0,
"apiBody": {
"name": "vm name",
"instanceOfferingUuid": "46466abc6c8931fdaab7a8df43e4f175",
"imageUuid": "43e997234af63863b28a5e9987e1d122",
"l3NetworkUuids": [
"8b4ddd66c7ba30598cdc7ab835e04f96"
],
"strategy": "InstantStart",
"timeout": -1.0,
"headers": {},
"id": "a9a029dba17842939f0227420d197121",
"createdTime": 1.545993580705E12
}
}
]
我们使用的工具是Gson,主要是因为它可以减少由于格式的错误导致程序异常。
首先分析这一串字符串,前面的地方是(key,value),然后就出来了一个apibody,apibody后头是一个 大括号,所以这是一个对象,接着看到 apibody里头的 l3NetworkUuids,后头是一个中括号,所以这是一个list,接着是headers,后面还是一个大括号,所以它是一个对象。因此我们确定了数据应该是这样包装的,Requests类包装了四个属性,其中一个是apibody,它是一个新的bean,然后apibody中又包装了一个8个属性,和一个list,一个object。
public class Request {
private String requestName;
private String apiName;
private String executeTimes;
private ApiBody apiBodyList;
//getter and setter
}
public class ApiBody {
private String name;
private String instanceOfferingUuid;
private String imageUuid;
private List<String> l3NetworkUuids;
private String strategy ;
private String timeout ;
private Headers headers;
private String id;
private String createdTime;
}
//getter and setter
public class headers(){
}
然后使用Gson进行转换,全部代码如下
String ZStackJson = "[{\"requestName\": \"create vm\"," +
" \"apiName\": \"org.zstack.header.vm.APICreateVmInstanceMsg\"," +
" \"executeTimes\": 1.0," +
" \"apiBodyList\": {" +
" \"name\": \"vm name\"," +
" \"instanceOfferingUuid\": "+instanceOfferingUuid+"," +
" \"imageUuid\":"+imageUuid+"," +
" \"l3NetworkUuids\": [" +
" "+l3NetworkUuids+"" +
" ]}}]";
List<Request> workList = gson2.fromJson(ZStackJson, new TypeToken<List<Request>>(){}.getType());
String workListId = ZStackUtil.createWorkList( listName,projectId,userId,UserSessionId,workList );
这样就将一个复杂的嵌套的Json字符串转为了 list.