Следующее выбрасывает ошибку:

String request = '{"Id": "0036D00000H24cKQAR","FirstName": "firstName", "someArray":["obj"]}';
Contact c = (Contact)JSON.deserialize(request, Contact.class);
System.debug(c);

Ошибка:

System.JSONException: No field name specified on column for sobject of type Contact

Я использую deserialize, а не deserializeStrict, поэтому в идеале массив следует игнорировать, верно?

1
SachiDangalla 30 Апр 2020 в 09:14

1 ответ

Да, вы правы в том, что массив следует игнорировать [как указано в руководство разработчика apex]:

При десериализации содержимого JSON в класс Apex в любой версии API или в объект в API версии 35.0 или более поздней исключений не возникает. Если исключение не выдается, этот метод игнорирует посторонние атрибуты и анализирует остальную часть содержимого JSON.

Фактически, эта проблема была поднята как ошибка несколько лет назад и была исправлена ​​​​в выпуске Winter 16. См. здесь . Однако проблема была исправлена ​​только для примитивных типов, отличных от массивов, и пустых массивов, т. е. если вы указали пустой массив "someArray":[] или строковый атрибут "someArray":"obj" в своем JSON, тогда десериализация работает, как указано в руководство разработчика. Но не работает в случае массива или для глубоко вложенных элементов JSON. В вашем случае вам придется использовать JSON.deserializeUntyped, а затем проанализировать возвращенный Map<String, Object>.

Не могли бы вы сообщить об этом как об ошибке в Salesforce?

1
arut 30 Апр 2020 в 10:58