如何解析 APEX REST 服务的 JSON 响应
How to parse a JSON response for APEX REST Service
我写了一个 REST class,它将 url 设置为调用 API 的端点。 API return 是一个时区值。 url 将经度和纬度作为参数传递。我得到的响应是一个复杂的 JSON 列表,我只需要 Timezone 对象的 Id 值。这是我对我传递的 lat/long 值的 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];
}
我使用此代码(当我 运行 匿名 window 时)得到的响应是:
TimeZone is{Aliases=(US/Pacific, US/Pacific-New), Countries=({Code=US, Name=United States}), Id=America/Los_Angeles, Names={Daylight=Pacific Daylight Time, Generic=Pacific Time, ISO6391LanguageCode=en, Standard=Pacific Standard Time}, 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}, Representativ
这是很多信息。我只想要 Id 等于的 America/Los_Angeles 部分(我在响应中有粗体字)。
此代码的另一个问题是它不是 returning anything/is void class.
我需要 t return 该值,因为触发器正在调用该方法并将使用该值来更新字段。
任何人都可以更正我的代码,以便它传递正确的 json 值和 returns 值吗?
EDIT/UPDATE:我现在收到的错误是“Variale 不存在:TimeZone(return 语句所在的位置)
您可以使用 JSON2APEX 从您的 JSON 响应轻松生成顶点 class。只需粘贴您的完整回复并单击 'Create Apex'。这将创建一个 class 来表示您的响应,以便您可以轻松地从中检索字段 (请记住,只有当您的响应是静态的,这意味着结构和命名保持不变,这才会真正起作用)。查看它生成的 class ,这会让您知道该怎么做。 class 有一个 parse(String JSON)
方法,您可以在 JSON 响应中调用该方法,以使用您的响应值检索 class 的实例。然后只需像处理任何对象一样检索所需的字段即可。
如果你走这条路,这里是如何获取时区 ID 代码的。
(注意:这假设您保持 class 的名称为标准 '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);
}
}
要return一个值只需将方法签名中的void
更改为List<String>
和return tId列表如下return tId;
我写了一个 REST class,它将 url 设置为调用 API 的端点。 API return 是一个时区值。 url 将经度和纬度作为参数传递。我得到的响应是一个复杂的 JSON 列表,我只需要 Timezone 对象的 Id 值。这是我对我传递的 lat/long 值的 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];
}
我使用此代码(当我 运行 匿名 window 时)得到的响应是:
TimeZone is{Aliases=(US/Pacific, US/Pacific-New), Countries=({Code=US, Name=United States}), Id=America/Los_Angeles, Names={Daylight=Pacific Daylight Time, Generic=Pacific Time, ISO6391LanguageCode=en, Standard=Pacific Standard Time}, 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}, Representativ
这是很多信息。我只想要 Id 等于的 America/Los_Angeles 部分(我在响应中有粗体字)。
此代码的另一个问题是它不是 returning anything/is void class.
我需要 t return 该值,因为触发器正在调用该方法并将使用该值来更新字段。
任何人都可以更正我的代码,以便它传递正确的 json 值和 returns 值吗?
EDIT/UPDATE:我现在收到的错误是“Variale 不存在:TimeZone(return 语句所在的位置)
您可以使用 JSON2APEX 从您的 JSON 响应轻松生成顶点 class。只需粘贴您的完整回复并单击 'Create Apex'。这将创建一个 class 来表示您的响应,以便您可以轻松地从中检索字段 (请记住,只有当您的响应是静态的,这意味着结构和命名保持不变,这才会真正起作用)。查看它生成的 class ,这会让您知道该怎么做。 class 有一个 parse(String JSON)
方法,您可以在 JSON 响应中调用该方法,以使用您的响应值检索 class 的实例。然后只需像处理任何对象一样检索所需的字段即可。
如果你走这条路,这里是如何获取时区 ID 代码的。
(注意:这假设您保持 class 的名称为标准 '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);
}
}
要return一个值只需将方法签名中的void
更改为List<String>
和return tId列表如下return tId;