2012-02-14 30 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