前言
JSON(JavaScript Object Notation)格式是目前比较流行的一种数据传输方式。JSON是一种轻量级的数据传输方式(尤其相对于XML方式),而且采用JSON传输数据结构清晰,易于理解和解析。在Salesforce中大部分的数据传输都可以采用JSON(SOAP/Metadata部分强制需要XML),所以有必要去了解Salesforce对于JSON的支持力度。
相关类
- JSONParser:需要实例,以调用相应的方法。主要功能是将JSON字符串转化为对象,并提供可读取为Apex基本类型/Apex Object方法,例如:getDateValue();
- JSONGenerator:需要实例,以调用相应的方法。主要功能是将Apex对象等转化为JSON字符串,提供Step By Step写入,例如:writeTimeField();
- JSON:静态方法,不需要实例。一个强大的Super(效果相当于,并不是技术实现),提供了JSONParser/JSONGenerator实例方法。并提供将Apex对象转为JSON字符串/JSON字符串转为Apex Object/Collection(List/Map等);
- JSONToken:枚举类型。主要服务于JSONParser
下面是一段JSON数据,我们尝试用不同的方式解析/组装:
{
"messages": [
{
"type": "Availability",
"message": {
"results": [
{
"id": "5732800000005GQ",
"isAvailable": true
}
]
}
}
]
}
解析
以获得results中isAvailable值为例:
- JSONParser
String jsonS = '{"messages":[{"type":"Availability","message":{"results":[{"id":"5732800000005GQ","isAvailable":true}]}}]}';
JSONParser parser = JSON.createParser(jsonS);
while (parser.nextToken() != null) {
if(parser.getCurrentToken() == JSONToken.FIELD_NAME &&
parser.getText() == 'isAvailable') {
parser.nextValue();
System.debug('-- isAvailable: ' + parser.getBooleanValue());
}
}
- JSON
String jsonS = '{"messages":[{"type":"Availability","message":{"results":[{"id":"5732800000005GQ","isAvailable":true}]}}]}';
Map<String, Object> obj = (Map<String, Object>)JSON.deserializeUntyped(jsonS);
List<Object> messages = (List<Object>)obj.get('messages');
for(Object o : messages) {
Map<String, Object> messageO = (Map<String, Object>)o;
Map<String, Object> message = (Map<String, Object>)messageO.get('message');
List<Object> results = (List<Object>)message.
String jsonS = '{"messages":[{"type":"Availability","message":{"results":[{"id":"5732800000005GQ","isAvailable":true}]}}]}';
JSONParser parser = JSON.createParser(jsonS);
while (parser.nextToken() != null) {
if(parser.getCurrentToken() == JSONToken.FIELD_NAME &&
parser.getText() == 'isAvailable') {
parser.nextValue();
System.debug('-- isAvailable: ' + parser.getBooleanValue());
}
}
String jsonS = '{"messages":[{"type":"Availability","message":{"results":[{"id":"5732800000005GQ","isAvailable":true}]}}]}';
Map<String, Object> obj = (Map<String, Object>)JSON.deserializeUntyped(jsonS);
List<Object> messages = (List<Object>)obj.get('messages');
for(Object o : messages) {
Map<String, Object> messageO = (Map<String, Object>)o;
Map<String, Object> message = (Map<String, Object>)messageO.get('message');
List<Object> results = (List<Object>)message.