我已经编写了一个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值并返回该值?谢谢
您可以使用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;