salesforce 零基础开发入门学习(十三)salesforce中JSON的使用

JSON作为一种目前流行的轻量级数据交换格式,salesforce也对其有良好的类对其进行封装处理。salesforce中前后台交互时,使用JSON可以将apex的Object对象进行序列化和反序列化。

主要有三个类处理JSON:1.System.JSON;2.System.JSONGenerator;3.System.JSONParser

这些方法如果调用出现错误则抛出JSONException异常。

一) System.JSON

使用JSON类和方法执行往返的序列化和反序列化JSON内容,这些方法允许你将Object对象序列化成JSON内容,也允许将JSON内容反序列化成Object对象;

主要方法如下:

1.public static String serialize(Object objectToSerialize):此方法用于将Object对象序列化成JSON内容。

2.public static String serializePretty(Object objectToSerialize:此方法用于将Object对象序列化成JSON内容,和上面方法的区别仅为此方法以精美的输出格式输出。

下面通过一个例子说明:

List<Goods__c> goods = [select Id,Name,GoodsName__c from Goods__c limit 1];//通过Serialize方法序列化
String goodsToJson = JSON.serialize(goods);//通过serializePretty方法序列化
String goodsToJsonPretty = JSON.serializePretty(goods);
System.debug(goodsToJson);
System.debug(goodsToJsonPretty);

输出结果如下:

[{"attributes":{"type":"Goods__c","url":"/services/data/v36.0/sobjects/Goods__c/a002800000VGxdqAAD"},"Id":"a002800000VGxdqAAD","Name":"a002800000VGxdq","GoodsName__c":"魅蓝note3"}]

[ {
  "attributes" : {
    "type" : "Goods__c",
    "url" : "/services/data/v36.0/sobjects/Goods__c/a002800000VGxdqAAD"
  },
  "Id" : "a002800000VGxdqAAD",
  "Name" : "a002800000VGxdq",
  "GoodsName__c" : "魅蓝note3"
} ]

3.public static Object deserialize(String jsonString, System.Type apexType):此方法用于将JSON内容反序列化成Apex的Object对象

//接上面Serialize的Sample
List<Goods__c> goodsList = (List<Goods__c>)JSON.deserialize(goodsToJson,List<Goods__c>.class);
for(Goods__c goodsItem : goodsList) {
	if(goodsItem.GoodsName__c != null) {
		System.debug(goodsItem.GoodsName__c);
	}
}

4.public static Object deserializeUntyped(String jsonString):此方法用于将指定的JSON内容反序列化成基本数据类型的集合,如果不是基本数据类型,则在反序列化时报异常:System.TypeException: Invalid conversion from runtime type List<ANY> to List<XXX>。eg:

String jsonList = '[{"2":"object2","1":"object1"}]';
List<Object> listJson = (List<Object>)JSON.deserializeUntyped(jsonList);
for(Object listItem : listJson) {
   if(listItem instanceof Map<String,Object>) {
   	System.debug('通过json 的反序列化(Map)' + (Map<String,Object>)listItem);
   } else {
   	System.debug('通过json 的反序列化' + listItem);
   }
}

注:通过deserializeUntyped方法不能反序列化sObject类型,只允许反序列化基本数据类型。

5.public static System.JSONGenerator createGenerator(Boolean prettyPrint):返回JSONGenerator对象,其中形参prettyPrint代表JSONGenerator创建JSON内容是否遵循缩进格式,设置为true则遵循。

6.public static System.JSONParser createParser(String jsonString):返回JSONParser对象,其中形参jsonString代表要解析的json的内容。

二) JSONGenerator

此类包含的方法用来通过标准的JSON编码将object对象序列化成JSON内容,方法主要作用为将各种类型的值写入JSON content中(相当于实例化JSON content value)。方法如下所示:

1.public void close():当JSON Generator关闭以后,无法再写入内容。

2.public Boolean isClosed():判断JSON Generator是否关闭,如果关闭返回true,否则返回false。

3.public String getAsString():返回生成的JSON的内容;

4.public Void writeBoolean(Boolean blobValue):写入指定的布尔类型值;

5.public void writeXXX:详情请看API

JSONGenerator jsonGenerator = JSON.createGenerator(true);
jsonGenerator.writeStartArray();
jsonGenerator.writeStartObject();
jsonGenerator.writeBooleanField('isStatus',true);
jsonGenerator.writeEndObject();    	
jsonGenerator.writeEndArray();
jsonGenerator.close();
System.debug(jsonGenerator.getAsString());

运行结果:

[ {
  "isStatus" : true
} ] 

三)JSONParser

 使用System.JSONParser类用来解析一个调用了外部服务的JSON格式的返回的响应内容,例如WEB service callout的json格式相应。主要方法如下:

1.public Void clearCurrentToken():此方法用于清除当前的Token。此方法执行以后,hasCurrentToken方法返回false,getCurrentToken返回null,想要恢复此token可以调用getLastClearedToken方法;

2.public System.JSONToken getCurrentToken():获取当前的Token;

String JSONContent = '{"firstName":"John"}'; 
JSONParser parser = JSON.createParser(JSONContent); 
// Advance to the next token. 
while (parser.nextToken() != null) { 
    System.debug('Current token: ' + parser.getCurrentToken()); 
}

3.public Boolean getBooleanValue();获取Boolean的值;

4.public Boolean getXXX():详情请看API文档;

1 String JSONContent = '{"isActive":true}';
2  JSONParser parser = JSON.createParser(JSONContent); 
3 // Advance to the start object marker. 
4 parser.nextToken(); 
5 // Advance to the next value. 
6 parser.nextValue(); 
7 // Get the Boolean value. 
8 Boolean isActive = parser.getBooleanValue();

5.public System.JSONToken nextToken():返回下一个Token,如果已经到达了输入流最后,则返回null;

四)JSONToken Enum

此枚举类定义一些用于解析JSON内容的Token值。

总结:如果正常的使用JSON的序列化和反序列化,System.JSON类里的serialize以及deserialize方法就足够使用了。如果需要自定义JSON样式,则可以使用JSON.Generate类来自定义JSON内容(项目中很少会遇见此种情况,通常JSON类的两种便搞定)。

本篇只是列举一部分的方法, 详情请自行查看api。如果有内容写错的地方欢迎批评指正,如果有问题欢迎留言共同探讨,转载请注明出处。  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏芋道源码1024

分布式事务 TCC-Transaction 源码分析 —— Dubbo 支持

1. 概述 本文分享 Dubbo 支持。 TCC-Transaction 通过 Dubbo 隐式传参的功能,避免自己对业务代码的入侵。可能有同学不太理解为什么说...

7007
来自专栏后端之路

Collections Arrays你会用么?

背景 JDK给我们提供了一些工具类 用来操作集合等。 通常来说命名规则就是XXXXs 比如Collections 比如Arrays 看到部分同学使用如下 ? ?...

2189
来自专栏ml

Guava------------Cache使用方法

    简单从这几个方面描述一下如何使用Cache,对Cache的各种原理介绍此处不涉及.     1.使用场景     2.如何使用Cache     3.创...

4768
来自专栏面朝大海春暖花开

java反射,代码优化

比如getAnswerA getAnswerB,这怎么动态调用。反射这个时候就用到了。

752
来自专栏三好码农的三亩自留地

Java反射—写给自己的总结

上面反射是Oracle官方文档的定义,反射能够突破访问权限控制,这还是很优秀的,但是,问题来了,为什么需要反射或者说什么情况下需要用反射?

1062
来自专栏MasiMaro 的技术博文

COM学习(一)——COM基础思想

学习微软技术COM是绕不开的一道坎,最近做项目的时候发现有许多功能需要用到COM中的内容,虽然只是简单的使用COM中封装好的内容,但是许多代码仍然只知其然,不知...

1053
来自专栏Android源码框架分析

听说你Binder机制学的不错,来面试下这几个问题(三)

很多文章将Binder框架定义了四个角色:Server,Client,ServiceManager、以及Binder驱动,但这容易将人引导到歧途:好像所有的Bi...

1162
来自专栏Java工程师日常干货

对ThreadLocal实现原理的一点思考前言ThreadLocal是什么、有什么、能做什么?看一看ThreadLocal源码

在《透彻理解Spring事务设计思想之手写实现》中,已经向大家揭示了Spring就是利用ThreadLocal来实现一个线程中的Connection是同一个,从...

753
来自专栏cloudskyme

JSON-lib框架,转换JSON、XML不再困难

Json-lib可以将Java对象转成json格式的字符串,也可以将Java对象转换成xml格式的文档,同样可以将json字符串转换成Java对象或是将xml字...

2934
来自专栏nnngu

经典Java面试题收集

2、访问修饰符public,private,protected,以及不写(默认)时的区别?

3518

扫码关注云+社区