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

  • 相关阅读:
    HDU 5791 Two (DP)
    POJ 1088 滑雪 (DPor记忆化搜索)
    LightOJ 1011
    POJ 1787 Charlie's Change (多重背包 带结果组成)
    HDU 5550 Game Rooms (ccpc2015 K)(dp)
    HDU 5542 The Battle of Chibi (ccpc 南阳 C)(DP 树状数组 离散化)
    HDU 5543 Pick The Sticks (01背包)
    HDU 5546 Ancient Go (ccpc2015南阳G)
    NB-IoT的DRX、eDRX、PSM三个模式 (转载,描述的简单易懂)
    MQTT 嵌入式端通讯协议解析(转)
  • 原文地址:https://www.cnblogs.com/zero-zyq/p/5372117.html
Copyright © 2011-2022 走看看