如何为APEX REST服务解析JSON响应

时间:2019-12-12 21:37:43

标签: json apex

我已经编写了一个REST类,该类将url设置为调用API的端点。 API返回时区值。网址将经度和纬度作为参数传递。我得到的响应是一个复杂的JSON列表,我只需要Timezone对象的Id值。这是我通过的经/纬度值的JSON响应形式得到的结果:

{
   "Version":"2019c",
   "ReferenceUtcTimestamp":"2019-12-10T21:14:23.7869064Z",
   "TimeZones":[
      {
         "Id":"America/Los_Angeles",
         "Aliases":[
            "US/Pacific",
            "US/Pacific-New"
         ],
         "Countries":[
            {
               "Name":"United States",
               "Code":"US"
            }
         ],
         "Names":{
            "ISO6391LanguageCode":"No supported language code supplied",
            "Generic":"",
            "Standard":"",
            "Daylight":""
         },
         "ReferenceTime":{
            "Tag":"PST",
            "StandardOffset":"-08:00:00",
            "DaylightSavings":"00:00:00",
            "WallTime":"2019-12-10T13:14:23.7869064-08:00",
            "PosixTzValidYear":2019,
            "PosixTz":"PST+8PDT,M3.2.0,M11.1.0",
            "Sunrise":"2019-12-10T07:42:22.383-08:00",
            "Sunset":"2019-12-10T16:18:49.095-08:00"
         },
         "RepresentativePoint":{
            "Latitude":34.05222222222222,
            "Longitude":-118.24277777777777
         },
         "TimeTransitions":[
            {
               "Tag":"PST",
               "StandardOffset":"-08:00:00",
               "DaylightSavings":"00:00:00",
               "UtcStart":"2019-11-03T09:00:00Z",
               "UtcEnd":"2020-03-08T10:00:00Z"
            },
            {
               "Tag":"PDT",
               "StandardOffset":"-08:00:00",
               "DaylightSavings":"01:00:00",
               "UtcStart":"2020-03-08T10:00:00Z",
               "UtcEnd":"2020-11-01T09:00:00Z"
            },
            {
               "Tag":"PST",
               "StandardOffset":"-08:00:00",
               "DaylightSavings":"00:00:00",
               "UtcStart":"2020-11-01T09:00:00Z",
               "UtcEnd":"2021-03-14T10:00:00Z"
            }
         ]
      }
   ]
}

这是我在APEX中的REST服务:

public class LPP_AccountTimeZone {
    public static List<String> getTimeZone(String latitude, String longitude){
        Http http = new Http();
        HttpRequest req=new HttpRequest();

         String url = 'https://atlas.microsoft.com/timezone/byCoordinates/json?subscription-key=XXXXXXXXXXXXXXXXXXXXXXXXXXXX&api-version=1.0&options=all&query='+latitude+','+longitude;

         req.SetEndPoint(url);

         req.setMethod('GET');
         HttpResponse res=http.send(req);

        if (res.getStatusCode() == 200) {
        List<String> TimeZone = new List<String>();
        TimeZoneJSON result = TimeZoneJSON.parse(res.getBody());

        for(TimeZoneJSON.TimeZones t : result.timeZones){
            System.debug('TimeZone is' + t.Id);
            TimeZone.add(t.Id);
        }

    }

    else{
        System.debug('The status code returned was not expected: ' + res.getStatusCode() + ' ' + res.getStatus());
    }
    return TimeZone[0];
}

使用此代码得到的响应(当我在匿名窗口中运行时)是:

  

TimeZone是{别名=(美国/太平洋地区,美国/太平洋新),国家/地区=({Code = US,名称=美国}), Id =美国/美国洛杉矶,名称= {Daylight =太平洋夏令时间,通用=太平洋时间,ISO6391LanguageCode = en,Standard =太平洋标准时间},ReferenceTime = {DaylightSavings = 00:00:00,PosixTz = PST + 8PDT,M3.2.0,M11.1.0,PosixTzValidYear = 2019,StandardOffset = -08:00:00,Sunrise = 2019-12-12T07:44:13.44-08:00,Sunset = 2019-12-12T16:18:47.934-08:00,Tag = PST,WallTime = 2019 -12-12T11:49:25.0802593-08:00},代表

很多信息。我只想要Id /等于的America / Los_Angeles部分(我在响应中有那个粗体)。

此代码的另一个问题是它没有返回任何内容/是无效类。
我不需要返回该值,因为触发器正在调用该方法,并将使用该值来更新字段。

任何人都可以更正我的代码,以便它传递正确的json值并返回该值吗?

编辑/更新:我现在遇到的错误是“变量不存在:TimeZone(返回语句所在的地方)

1 个答案:

答案 0 :(得分:1)

您可以使用JSON2APEX从JSON响应中轻松生成一个顶点类。只需粘贴您的完整回复,然后单击“创建Apex”。这样会创建一个表示您的响应的类,以便您可以轻松地从中检索字段(请注意,只有在您的响应是静态的(表示结构和命名保持不变)的情况下,这才真正起作用)。看一看它生成的类,这将使您对应该做什么有所了解。该类有一个parse(String JSON)方法,您可以调用JSON响应传递,以使用响应值检索该类的实例。然后,只需要像对待任何对象一样检索想要的字段即可。 如果您采用此路线,则以下是获取时区ID代码的样子。 (注意:这假定您将类的名称保留为标准的'JSON2Apex'

if (res.getStatusCode() == 200) {
    JSON2Apex result = JSON2Apex.parse(res.getBody()); 

    for(JSON2Apex.TimeZones t: result.timeZones){
        System.debug('TimeZone is' + t.id);
        tId.add(t);
    }
 }

要返回值,只需将方法签名中的void更改为List<String>并按以下方式返回tId列表return tId;

相关问题