就是這個網站:http://www.jsonschema2pojo.org/
首先我有一個Json格式是這樣:
{ "id":"2993688d-4122-4c33-813c-2ddd10268c93", "timestamp":"2017-04-15T13:54:37.254Z", "lang":"en", "result":{ "source":"agent", "resolvedQuery":"我要去台北", "action":"TheAction", "actionIncomplete":false, "parameters":{ "taiwan-city":[ "台北" ] }, "contexts":[ ], "metadata":{ "intentId":"58e62519-f775-4a66-8655-ac772d157cec", "webhookUsed":"false", "webhookForSlotFillingUsed":"false", "intentName":"TheIntent" }, "fulfillment":{ "speech":"請稍等,正在幫你處理。", "messages":[ { "type":0, "speech":"請稍等,正在幫你處理。" } ] }, "score":1.0 }, "status":{ "code":200, "errorType":"success" }, "sessionId":"1234567890" }看得出來這段要變成POJO有點不容易,只有對結構很熟悉的人能手刻出來,像我不熟悉就可以利用這個網站來轉換。
開啟那個網站把Json貼上去
Source type我選JSON,不知為啥選JSON Schema產出的ZIP打不開
因為我是用Gson解析,所以選Gson,其他都預設。
試過勾Include toString,但它產出的很像是用Apache Commons Lang來做,而我引入了Apache Commons Lang函式庫還是不能用,因此沒勾。
2017-5-3補充:
因它產出的Apache Commons Lang似乎是初版的,程式碼是這樣:
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import org.apache.commons.lang.builder.ToStringBuilder;
...
因我當時是下載Apache Commons Lang 3.5那當然不能用了,只要加個3上去就可以了!像這樣:
...
org.apache.commons.lang3.builder.ToStringBuilder;
...
選好點下面的Zip,就自動幫你產出了!
左邊的Preview就是預覽。
解壓縮ZIP,把產出的Java檔放進Java Application專案中。
來使用吧:
package apiai; import pojo.*; import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.io.BufferedReader; import java.io.InputStreamReader; import static org.apache.http.HttpHeaders.USER_AGENT; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; public class HttpClientExample { public static void main(String[] args) throws Exception { HttpClientExample http = new HttpClientExample(); System.out.println("Testing 1 - Send Http GET request"); http.sendGet(); } private void sendGet() throws Exception { String url = "https://api.api.ai/v1/query?v=20150910&query=我要去台北&lang=en&sessionId=1234567890"; HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(url); // add request header request.addHeader("User-Agent", USER_AGENT); request.addHeader("Authorization", "Bearer f67256b80e344e86affdd20487734835" ); HttpResponse response = client.execute(request); System.out.println("\nSending 'GET' request to URL : " + url); System.out.println("Response Code : " + response.getStatusLine().getStatusCode()); BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); String SerializationResult = ""; StringBuffer result = new StringBuffer(); String line = ""; while ((line = rd.readLine()) != null) { result.append(line); SerializationResult = result.toString(); } Gson gson = new GsonBuilder().disableHtmlEscaping().setFieldNamingPolicy(FieldNamingPolicy.IDENTITY).create();//將特殊字元正常輸出不轉換 Principal r = gson.fromJson(SerializationResult, Principal.class); System.out.println(r.getResult()); } }重點是46~50行 輸出結果:
Testing 1 - Send Http GET request Sending 'GET' request to URL : https://api.api.ai/v1/query?v=20150910&query=我要去台北&lang=en&sessionId=1234567890 Response Code : 200 Result{source=agent, resolvedQuery=我要去台北, action=TheAction, actionIncomplete=false, parameters=Parameters{taiwanCity=[台北]}, contexts=[], metadata=Metadata{intentId=58e62519-f775-4a66-8655-ac772d157cec, webhookUsed=false, webhookForSlotFillingUsed=false, intentName=TheIntent}, fulfillment=Fulfillment{speech=請稍等,正在幫你處理。, messages=[Message{type=0, speech=請稍等,正在幫你處理。}]}, score=1.0}可以看得出非常成功,另外POJO的toString是我用IDE產出的,原因上面有說明,因為那網站產出的我還不會用
抓Result下一層資料的寫法:
Gson gson = new GsonBuilder().disableHtmlEscaping().setFieldNamingPolicy(FieldNamingPolicy.IDENTITY).create();//將特殊字元正常輸出不轉換 Principal r = gson.fromJson(SerializationResult, Principal.class); System.out.println(r.getResult().getResolvedQuery());就只是後面再加個get而已
如果要抓那個最底層的type 0呢?
Gson gson = new GsonBuilder().disableHtmlEscaping().setFieldNamingPolicy(FieldNamingPolicy.IDENTITY).create();//將特殊字元正常輸出不轉換 Principal r = gson.fromJson(SerializationResult, Principal.class); System.out.println(r.getResult().getFulfillment().getMessages().get(0).getType());恩比較特別,讓我稍微試了幾次
輸出:
Testing 1 - Send Http GET request Sending 'GET' request to URL : https://api.api.ai/v1/query?v=20150910&query=我要去台北&lang=en&sessionId=1234567890 Response Code : 200 0
附上Principal類別以作參考:
package pojo; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class Principal { @SerializedName("id") @Expose private String id; @SerializedName("timestamp") @Expose private String timestamp; @SerializedName("lang") @Expose private String lang; @SerializedName("result") @Expose private Result result; @SerializedName("status") @Expose private Status status; @SerializedName("sessionId") @Expose private String sessionId; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getTimestamp() { return timestamp; } public void setTimestamp(String timestamp) { this.timestamp = timestamp; } public String getLang() { return lang; } public void setLang(String lang) { this.lang = lang; } public Result getResult() { return result; } public void setResult(Result result) { this.result = result; } public Status getStatus() { return status; } public void setStatus(Status status) { this.status = status; } public String getSessionId() { return sessionId; } public void setSessionId(String sessionId) { this.sessionId = sessionId; } @Override public String toString() { return "Principal{" + "id=" + id + ", timestamp=" + timestamp + ", lang=" + lang + ", result=" + result + ", status=" + status + ", sessionId=" + sessionId + '}'; } }
沒有留言:
張貼留言