2012-02-14 10 views
0

私は自分のコードに次のエラーを取得しています:アペックスJSONパースエラー

System.JSONExceptionのヌルをで デシリアライズにApexのオブジェクトの種類を知ってはいけない[ライン:1、列:1] 11(システムコード) Class.FactorLab.FactorLabWebservices.RetrieveUsersFromFactorLab:ライン 60、カラム1 Class.FactorLab.PullUsers.execute:

:行61、列ここで1

は、問題のコードであります

有効なJSONを受け取っていると確信していますが、このエラーが発生したときに受け取っているJSONが正確かはわかりません。

[ { "SFDCStatus" : "RETRIEVED", 
    "address" : "123 Fake St.", 
    "addressLine1" : "Address1", 
    "addressLine2" : "Address2", 
    "city" : "San Francisco", 
    "companyName" : "Big Cheese, Inc.", 
    "deleted" : false, 
    "email" : "[email protected]", 
    "firstName" : "James", 
    "hireDate" : "2000-04-15T00:00:00Z", 
    "id" : 39, 
    "lastName" : "Willard", 
    "lastUpdated" : "2011-11-23T05:44:03Z", 
    "myersBriggs" : "SFDC", 
    "name" : "James Willard", 
    "phone" : "415-555-1212", 
    "position" : "Big Chief", 
    "regions" : [ { "deleted" : false, 
      "id" : 445, 
      "name" : "Mountain" 
     } ], 
    "state" : "CA", 
    "yearsExp" : 20.0, 
    "zip" : "94131" 
    }, 
    { "SFDCStatus" : "RETRIEVED", 
    "deleted" : false, 
    "firstName" : "Daniel", 
    "id" : 40, 
    "lastName" : "Adams", 
    "lastUpdated" : "2011-11-23T05:44:03Z", 
    "name" : "Daniel Adams" 
    } 
] 

任意のアイデア:

[] 

また、このような何かを得ることができます:それは、単純に空の配列を得ることができますか?誰かがこれがSalesforce.comのバグだと言いましたが、それが真実であっても、回避策が必要です。

答えて

2

は正しくキャスティングできません。私はまだネイティブJSONをシリアライズ/デシリアライズして遊んでいないし、独自の解析/永続化を行うことを好みました。しかし、エラーの原因となって、あなたの行が疑わしい:

List<FactorLabPullUser> flusers = (List<FactorLabPullUser>)JSON.deserialize(res.getBody(), Type.forname('List<FactorLabPullUser>')); 

が、私はそれがどのように見えるべきだと考え、以下:

List<FactorLabPullUser> flusers = (List<FactorLabPullUser>)JSON.deserialize(res.getBody(), List<FactorLabPullUser>.class); 
働い
+0

が、コードの原作者によると、だけのために働くということしばらくしてから元の方法に戻すまで同じエラーが再び出るようになるでしょう。ある種の「キャッシング」問題。それは私には意味をなさない。あなたには意味がありますか? – jhericks

+0

キャッシングの問題は、新しいケースが送信されるように聞こえるように聞こえます。これは実際には真であり、これをモデル化したコードはApexの開発者ガイドからそのままです。言い換えれば、それが真実なら、それはSalesforceのバグであり、修正されるでしょう。しかし、個人的には私は手でパースしてしまいました。システムJSONパーサークラス/メソッドのニュアンスを理解したら素晴らしいことがありました。シリアライズ/デシリアライズ機能の現在の制限だけで、私に忍び寄ることができます。 2セント。 – Adam

+0

私はケースを提出しましたが、私はプレミアサポートがないので拒否しました。私はサポートのために支払う必要があることを理解していますが、バグを提出するために実際に支払うことはありません。しかたがない。だからあなたが「手でパースする」と言うと、あなたはApexにあなた自身のJSONパーサーを書くことについて話していませんか? – jhericks

0

あなたのコードスニッピットから確かにわかりませんが、FactorLabPullUserクラスが内部クラスの場合は、Type.forName()を動作させるために完全に修飾する必要があります。

List<FactorLabPullUser> flusers = (List<FactorLabPullUser>)JSON.deserialize(res.getBody(), Type.forname('List<Outerclass.FactorLabPullUser>')); 

は、私はあなたが言及バグが.class法を用いて行うことであると考えて - 私は、これは常に有効なTypeを返さない気づいている:

私はこのような何かを見ることを期待します。