Force.comでのJSON Support -ApexコントローラのRemoteActionを添えて-(その後)
以前、Force.comでのJSON Support - yonet77的な雑記帳にて、管理パッケージ内にあるカスタムオブジェクトの日付項目をJSON.deserializeできない...ということを書きました。
うん、もう覚えてないよねw
ことの発端は、Summer '12 になった直後に、JSON.deserialize の挙動がおかしくなったことでした。
@yonet77: Type t = Type.forName('List<Account>'); ってやると "System.UnexpectedException: Salesforce System Error:" って怒られるよ。。前のバージョンでは動いたのに... #forcedotcom
でも、その1週間後くらいには直ってたので、ヨカッタヨカッタと思ったところで、もう1つふと思い出しました。
そう、管理パッケージ内のカスタムオブジェクトの日付項目を含めてJSON.deserializeするとエラーになってた件です。
↓
FATAL_ERROR System.JSONException: Cannot deserialize instance of date from VALUE_STRING value 2011-12-30
今回の修正で、挙動が変わったかもしれないッ・・・!
ということで、レッツトライ。
こんなコードを走らせてみました。
Type objType = Type.forName('gii__SalesOrder__c'); String paramString = '{"gii__RequiredDate__c":"2011-12-30", "gii__Released__c":true, "Phase__c":"ご来店", "Remarks__c":"ABCDEFGHIJKLMN,4444aaa"}'; gii__SalesOrder__c testSO = (gii__SalesOrder__c)JSON.deserialize(paramString, objType); System.debug('** testSO : ' + testSO);
↓
14:21:46.132 (14132484000)|USER_DEBUG|[172]|DEBUG|** testSO : gii__SalesOrder__c:{gii__RequiredDate__c=2011-12-30 00:00:00, Remarks__c=ABCDEFGHIJKLMN,4444aaa, Phase__c=ご来店, gii__Released__c=true}
おや・・?なんか日付もちゃんとdeserializeされてるじゃないですか!
何やらパッケージ管理下にあるカスタムオブジェクトの日付項目も問題なくJSON.deserializeを使えるようになってましたー。
もちろん、これも動きました。↓
Type objType = Type.forName('List<gii__SalesOrder__c>'); String paramString = '[{"gii__RequiredDate__c":"2011-12-30", "gii__Released__c":true, "Phase__c":"ご来店", "Remarks__c":"ABCDEFGHIJKLMN,4444aaa"}]'; List<gii__SalesOrder__c> testSOs = (List<gii__SalesOrder__c>)JSON.deserialize(paramString, objType); System.debug('** testSOs : ' + testSOs);
↓
14:57:01.629 (11629374000)|USER_DEBUG|[176]|DEBUG|** testSOs : (gii__SalesOrder__c:{gii__RequiredDate__c=2011-12-30 00:00:00, Remarks__c=ABCDEFGHIJKLMN,4444aaa, Phase__c=ご来店, gii__Released__c=true})
とりあえず、思った通りの挙動になったみたいで良かったです。
ではまた次回(※未定)!