2012-02-14 2 views
0

Я получаю следующее сообщение об ошибке в моем коде:Apex 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

Похоже, вы may не должны быть правильно установлены. Я еще не играл с сериализованным/десериализованным родным 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. Просто текущие ограничения функций serialize/deserialize достаточно, чтобы дать мне крипы. 2-х центов. – Adam

+0

Я подал дело, но они отклонили его, поскольку у меня нет поддержки премьер-министра. Я понимаю, что мне приходится платить за поддержку, но на самом деле не платить, чтобы отправить ошибку. Ну что ж. Поэтому, когда вы говорите «ручной разбор», вы не говорите о написании собственного анализатора JSON в Apex, не так ли? – jhericks

0

Я не могу точно видеть ваш код snippit, но если класс FactorLabPullUser является внутренним классом, вам нужно будет полностью квалифицировать его для работы Type.forName().

я ожидал бы увидеть что-то вроде этого:

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

Я думаю, что ошибка вы упоминаете это делать с использованием метода .class - Я заметил, что это не всегда возвращает действительный Type.

Смежные вопросы