Каков эффективный способ получить поля из этого объекта JSON?

У меня есть следующий код, который возвращает объект 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");

                    }

Вот объект json, который я получаю от MS Office API.

{"@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 Enterprise E3","sender":{"emailAddress":{ "name":"Группа Microsoft Online Services","address":"[email protected]"}}},{"@odata.etag":"W/\"JUU70303\"","id": ”UEYO93988FK;O38GV3J884=","createdDateTime":"2016-08-26T15:28:47Z","subject":"Подтверждение заказа: Спасибо за покупку","sender":{"emailAddress":{"name ":"Группа Microsoft Online Services","address":"[email protected]"}}},{"@odata.etag":"W/\"LJKOIU987983\"","id":"ladjksflk83l .x8783LKFW3=","createdDateTime":"2016-06-24T03:03:26Z","subject":"Внимание: ваш Microsoft Azure Active Подписка на пробную версию Directory Premium скоро будет отключена","sender":{"emailAddress":{"name":"Microsoft Online Services Team","address":"[email protected]"}}}]}


person WowBow    schedule 13.09.2016    source источник
comment
Я бы порекомендовал вам потратить некоторое время на изучение БЫСТРОГО XML-парсера jackson json. особенно cowtowncoder.com/blog/archives/2011/07/entry_458.html   -  person Hector    schedule 13.09.2016


Ответы (1)


По умолчанию полезные данные ответа REST API Office 365 также включают общие аннотации, например:

  • odata.context: контекстный URL полезной нагрузки
  • odata.etag: ETag объекта, в зависимости от ситуации.

Картинка ниже демонстрирует это

введите здесь описание изображения

Как вы уже догадались, им можно управлять через odata.metadata параметр:

odata.metadata parameter можно применить к заголовку Accept запроса OData, чтобы повлиять на то, сколько управляющей информации будет включено в ответ.

Пример (версия C#)

В примере показано, как установить параметр формата odata.metadata=none через заголовок Accept, чтобы указать, что службе СЛЕДУЕТ опускать управляющую информацию

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);
}
person Vadim Gremyachev    schedule 14.09.2016
comment
Спасибо за пример того, как опустить ненужные данные. По крайней мере, это помогло мне избежать ответов, связанных с Odata, которые нам не нужны, но мне все равно нужно пройти тот же маршрут, что и в моем коде, чтобы получить тему. Я думал, что будет такой способ, как jsonObject.get(value.sender), но он так не работает. - person WowBow; 15.09.2016