【问题标题】:Apex JSON parsing errorApex JSON 解析错误
【发布时间】:2012-02-14 20:04:15
【问题描述】:

我的代码中出现以下错误:

System.JSONException null 不知道 Apex 对象的类型 在 [line:1, column: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" : "james.willard@fake.com",
    "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 的错误,但似乎即使这是真的,也必须有解决方法。

【问题讨论】:

    标签: json apex-code


    【解决方案1】:

    看起来你可能没有正确投射。我还没有过多地使用序列化/反序列化本机 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);
    

    【讨论】:

    • 这行得通,但是根据代码的原始作者,这只会工作一段时间,然后再次开始出现相同的错误,直到您将其切换回原始方式。某种“缓存”问题。这对我来说没有任何意义。这对你有意义吗?
    • 缓存问题听起来像是需要提交一个新案例的事情,如果它真的是真的的话,因为我在此之后建模的代码直接来自 Apex 开发人员指南。换句话说,如果属实,这是一个 Salesforce 错误,将被修复。但就我个人而言,我一直坚持手动解析,一旦我弄清楚系统 JSON 解析器类/方法的细微差别,这真是太棒了。仅序列化/反序列化功能的当前限制就足以让我毛骨悚然。 2 美分。
    • 我提交了一个案例,但他们拒绝了,因为我没有得到首要支持。我理解必须为支持付费,但不必为提交错误付费。那好吧。因此,当您说“手动解析”时,您不是在谈论在 Apex 中编写自己的 JSON 解析器吗?
    • 不,不是我自己的 JSON 解析器。我使用 System.JSONParser 遍历 JSON 结果并自己填充我的自定义对象。在此处查看 consumeObject 方法的示例代码:blogs.developerforce.com/developer-relations/2011/09/…。基本上,我使用 JSONParser 来遍历 JSON 并定位我感兴趣的数据元素。这比简单地反序列化 JSON 需要更多的工作,但我更能控制并且没有相同的限制。例如,如果你有一个 Map,你就不能正确地序列化它。只有 String-SObject。
    • 我也遇到了这个问题,通过我们的合作伙伴门户拒绝了支持(与此处发布的疑似 Salesforce 错误有关:stackoverflow.com/questions/9352149/…)。是的,出于质量考虑,我希望他们发布一种方法,让每个人都可以报告潜在的 Salesforce 错误。
    【解决方案2】:

    我无法从您的代码片段中确定,但如果 FactorLabPullUser 类是一个内部类,您将需要完全限定它才能使 Type.forName() 工作。

    我希望看到这样的东西:

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

    我认为您提到的错误与使用 .class 方法有关 - 我注意到这并不总是返回有效的 Type

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多