2012-02-14 126 views
0

我得到我的代碼以下錯誤:頂點JSON解析錯誤

System.JSONException空不知道的Apex對象來 反序列化的類型[線:1,列:1] 11(系統代碼) Class.FactorLab.FactorLabWebservices.RetrieveUsersFromFactorLab:線 60,第1個Class.FactorLab.PullUsers.execute:線61,第1列

這裏是有問題的代碼:

public static List<FactorLabPullUser> RetrieveUsersFromFactorLab(List<String> ids){ 
    HttpRequest req = getHttpRequest(baseUrl + '/ws/sfdc/people/retrieve', 'POST');   
    req.setBody(JSON.serialize(ids)); 
    req.setHeader('Content-Type', 'application/json'); 
    if(Test.isRunningTest()){ 
     return null; 
    }   
    HttpResponse res = sendRequest(req); 
    // This is the line with the error 
    List<FactorLabPullUser> flusers = (List<FactorLabPullUser>)JSON.deserialize(res.getBody(), Type.forname('List<FactorLabPullUser>')); 

    return flusers; 
}  

我確定它接收到有效的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 2012-02-20 16:22:05

+0

緩存問題聽起來像是需要提交新案例的事情,如果它確實是真的,因爲我之後建模的代碼直接來自Apex開發人員指南。換句話說,如果這是真的,這是一個Salesforce的bug,並且會被修復。但個人而言,我一直堅持使用手動解析,一旦我找到了系統JSON解析器類/方法的細微差別,這真是太棒了。只是當前的序列化/反序列化功能的限制足以讓我感到毛骨悚然。 2美分。 – Adam 2012-02-20 21:13:10

+0

我提交了一個案例,但他們拒絕了,因爲我沒有主要的支持。我明白必須爲支持付費,但不是真正付費來提交錯誤。好吧。所以,當你說「手動解析」時,你並不是在談論在Apex中編寫自己的JSON解析器嗎? – jhericks 2012-02-21 01:43:10

0

我無法確定從您的代碼snippit中看到,但如果FactorLabPullUser類是內部類,您將需要完全限定其使用Type.forName()才能工作。

我希望看到這樣的事情:

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

我認爲你提到的錯誤是與使用.class方法做 - 我注意到這並不總是返回一個有效Type