2016-09-13 24 views
0

我有下面的代碼返回json對象。我需要過濾發件人電子郵件,主題和creationDate。代碼完成這項工作,但我覺得有一個有效的方法來做到這一點。我很欣賞你的建議。從這個JSON對象獲取字段的有效方法是什麼?

ResponseEntity<String> response = 
          restTemplate.exchange(app.getResourceUrl() + personnelEmail+ 
          MESSAGE+"/?$select=Sender,Subject,CreatedDateTime", HttpMethod.GET, request, String.class); 

        String str=response.getBody(); 
        JSONObject jsonObject= new JSONObject(str); 
        JSONArray arrayList= (JSONArray)jsonObject.get("value"); 

        List l=arrayList.toList(); 

        for(int i=0;i<l.size();i++){ 
         HashMap<String,HashMap> hashMap=(HashMap<String,HashMap>)l.get(i); 

         HashMap<String,HashMap> sender= hashMap.get("sender"); 
         HashMap<String,String> senderEmail= sender.get("emailAddress"); 

         String email= senderEmail.get("address"); 

        } 

這是我從MS Office API收到的json對象。

{ 「@ odata.context」: 「https://graph.microsoft.com/v1.0/ $元數據#用戶( 'user34.onmicrosoft.com')/消息(發送者,主題,createdDateTime)」, 「值」:[{「@的OData。 etag「:」W/\「sljkasfdiou7978klosadf \」「,」id「:」lkjasdfu97978KLJASDFS_WGHJJ76J897DKdcuvtymBTItq836K34PUAAAvoK3SAAA =「,」createdDateTime「:」2016-08-27T04:07:08Z「,」subject「:」查看 Office 365 Enterprise E3 billing「 statement」,「sender」:{「emailAddress」:{「name」:「Microsoft Online Services Team」,「address」:「[email protected]」}}},{「@ odata.etag 「:」W/\「JUU70303 \」「,」id「:」UEYO93988FK; O38GV3J884 =「,」createdDateTime「:」2016-08-26T15:28:47Z「,」subject「:」訂購 確認:謝謝爲您的 購買「,」se nder「:{」emailAddress「:{」name「:」Microsoft Online Services Team「,」address「:」[email protected]「}}},{」@ odata.etag「:」W/\ 「LJKOIU987983 \」「,」id「:」ladjksflk83l.x8783LKFW3 =「,」createdDateTime「:」2016-06-24T03:03:26Z「,」subject「:」注意: 您的Microsoft Azure Active Directory Premium試用訂閱將會 即將停用」, 「發件人」:{ 「EMAILADDRESS」:{ 「名」: 「微軟在線服務 隊」, 「地址」: 「[email protected]」}}}]}

+0

我建議你花一些時間學習更快的XML jackson json解析器。尤其是http://www.cowtowncoder.com/blog/archives/2011/07/entry_458.html – Hector

回答

1

默認情況下,Office 365 REST API響應負載還包括常用的annotations,例如:

  • odata.context:有效載荷
  • odata.etag的背景下網址:實體的ETag的酌情

下面的圖片表明,它

enter image description here

正如你已經猜到了可能它可以通過odata.metadata parameter控制:

可以將odata.metadata parameter應用於OData請求的Accept頭部 ,以影響包含在響應中的控制信息的數量爲 。

實施例(C#版本)

的示例演示如何通過Accept報頭中設置odata.metadata=none格式參數來指明服​​務應該忽略控制信息

using (var client = new HttpClient(handler)) 
{ 
    var url = "https://outlook.office365.com/api/v1.0/me/messages?$select=Sender,Subject,DateTimeCreated"; 
    client.DefaultRequestHeaders.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(GetMediaType("none",false,false))); 
    var result = await client.GetStringAsync(url); 
    var data = JObject.Parse(result); 

    foreach (var item in data["value"]) 
    { 
     //process item; 
    } 
} 

其中

private static string GetMediaType(string metadata,bool streaming,bool IEEE754Compatible) 
{ 
    return String.Format("application/json; OData.metadata={0}; OData.streaming={1}; IEEE754Compatible={2}",metadata,streaming, IEEE754Compatible); 
} 
+0

感謝有關如何省略不必要數據的示例。至少它幫助我避免了我們不需要的Odata相關響應,但我仍然需要通過跟隨我的代碼來檢索主題的相同路線。我認爲會有像jsonObject.get(「value.sender」)的方式,但它沒有這樣工作。 – WowBow

相關問題