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

问题描述 投票:0回答:1

我已经编写了一个REST类,该类将url设置为调用API的端点。 API返回时区值。网址将经度和纬度作为参数传递。我得到的响应是一个复杂的JSON列表,我只需要Timezone对象的Id值。这是我通过的经/纬度值作为JSON响应得到的结果:{“版本”:“ 2019c”,“ ReferenceUtcTimestamp”:“ 2019-12-10T21:14:23.7869064Z”,“ TimeZones”:[{“ Id”:“ America / Los_Angeles”,“ Aliases”:[“ US / Pacific“,” US / Pacific-New“],” Countrys“:[{” Name“:” United States“,” Code“:” US“}]],” Names“:{” ISO6391LanguageCode“:”不支持的语言提供的代码“,” 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“,”日出“:” 2019-12-10T07:42:22.383-08:00“,”日落“:” 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“,” StandardO ffset“:”-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 void 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) {
            Map<String,Object> results = (Map<String,Object>)JSON.deserializeUntyped(res.getBody());
            List<Object> timeZone = (List<Object>)results.get('TimeZones');
            List<Object> tId = new List<Object>();

            for(Object t: timeZone){
                System.debug('TimeZone is' + t);
                tId.add(t);
            }
        }

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

    }

}

我收到此代码的响应(当我在匿名窗口中运行它时为:时区为{别名=(美国/太平洋地区,美国/太平洋新州),国家/地区=({Code =美国,名称=美国}),Id =美国/洛杉矶/天使,名称= {Daylight = Pacific Daylight Time ,通用=太平洋时间,ISO6391LanguageCode = zh-CN,标准=太平洋标准时间},ReferenceTime = {DaylightSavings = 00:00:00,PosixTz = PST + 8PDT,M3.2.0,M11.1.0,PosixTzValidYear = 2019,StandardOffset = -08 :00:00,日出= 2019-12-12T07:44:13.44-08:00,日落= 2019-12-12T16:18:47.934-08:00,标记= PST,墙上时间= 2019-12-12T11:49 :25.0802593-08:00},代表

这是很多信息。我只想要Id /等于的America / Los_Angeles部分(我在响应中有那个粗体)。此代码的另一个问题是,它不返回任何内容或为void类。我不需要返回该值,因为触发器正在调用该方法,并将使用该值来更新字段。任何人都可以请更正我的代码,以便它传递正确的json值并返回该值?谢谢

apex
1个回答
0
投票

您可以使用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;

© www.soinside.com 2019 - 2024. All rights reserved.