zoukankan      html  css  js  c++  java
  • 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。如果有内容写错的地方欢迎批评指正,如果有问题欢迎留言共同探讨,转载请注明出处。

  • 相关阅读:
    分布式数据库数据一致性的原理、与技术实现方案
    分布式系统全局唯一ID简介、特点、5种生成方式
    分布式Session共享的4类技术方案,与优劣势比较
    深入理解分布式事务
    分布式事务的解决方案,以及原理、总结
    调研 | 5种分布式事务解决方案优缺点对比
    网页大文件上传支持断点上传
    WEB大文件上传支持断点上传
    http大文件上传支持断点上传
    B/S大文件上传支持断点上传
  • 原文地址:https://www.cnblogs.com/zero-zyq/p/5372117.html
Copyright © 2011-2022 走看看