【问题标题】:What is the efficient way to get the fields from this JSON object?从这个 JSON 对象获取字段的有效方法是什么?
【发布时间】:2016-09-13 18:03:12
【问题描述】:

我有以下返回 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/$metadata#users('user34.onmicrosoft.com')/messages(sender,subject,createdDateTime)","value":[{"@odata.etag ":"W/\"sljkasfdiou7978klosadf\"","id":"lkjasdfu97978KLJASDFS_WGHJJ76J897DKdcuvtymBTItq836K34PUAAAvoK3SAAA=","createdDateTime":"2016-08-27T04:07:08Z","subject":"查看 您的 Office 365 企业版 E3 计费 statement","sender":{"emailAddress":{"name":"Microsoft Online Services 团队","地址":"T45763@email.microsoftonline.com"}}},{"@odata.etag":"W/\"JUU70303\"","id":"UEYO93988FK;O38GV3J884="," createdDateTime":"2016-08-26T15:28:47Z","subject":"订单 确认:谢谢您的 purchase","sender":{"emailAddress":{"name":"Microsoft Online Services 团队","地址":"obue733@email.microsoftonline.com"}}},{"@odata.etag":"W/\"LJKOIU987983\"","id":"ladjksflk83l.x8783LKFW3="," createdDateTime":"2016-06-24T03:03:26Z","subject":"注意: 您的 Microsoft Azure Active Directory Premium 试用订阅将 即将禁用","sender":{"emailAddress":{"name":"Microsoft Online 服务团队","address":"635cdeee@email.microsoftonline.com"}}}]}

【问题讨论】:

标签: json parsing gson office365 azure-ad-graph-api


【解决方案1】:

默认情况下,Office 365 REST API 响应负载还包括常见的annotations,例如:

  • odata.context:payload 的上下文 URL
  • odata.etag:实体的 ETag,视情况而定

下图演示

正如您已经猜到的那样,它可以通过odata.metadata parameter 控制:

odata.metadata parameter 可以应用于 Accept 标头 影响控制信息量的 OData 请求 包含在响应中。

示例(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);
}

【讨论】:

  • 感谢您提供有关如何省略不必要数据的示例。至少它帮助我避免了我们不需要的与 Odata 相关的响应,但我仍然必须通过与我在代码上检索主题相同的路线。我以为会有像 jsonObject.get("value.sender") 这样的方法,但它没有那样工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多