WebInvoke/DataContractJsonSerializer, «1,6276» не может быть проанализировано как «двойное»

Я использую WCF WebInvokeAttribute для декларативных запросов JSON (DataContractJsonSerializer) с сериализацией на основе DataContractAttribute/DataMemberAttribute.

Я использую службу, которая поддерживает возврат JSON, содержащего данные, основанные на разных культурах. По умолчанию эта служба использует настройки культуры en-US, что означает, что разделителем десятичных знаков будет «.».

У меня есть класс со свойством System.Double. Если я запрашиваю данные, используя культуру, которая использует "," в качестве десятичного разделителя, я получаю SerializationException при попытке десериализовать значение для этого свойства при разборе System.Double:

«Произошла ошибка при десериализации объекта типа XXX. Значение «1,6276» не может быть проанализировано как тип «двойной».

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

Таким образом, службы будут ломаться для любых культур, которые не используют "." как десятичный разделитель.

Будем признательны за помощь.

Спасибо!


person baretta    schedule 03.04.2009    source источник
comment
Пожалуйста, объясните немного лучше, почему культура является фактором в вашем сервисе и чем он отличается от других сервисов. Я бы ожидал услышать об этой проблеме раньше, если бы она была распространена.   -  person John Saunders    schedule 03.04.2009
comment
Это клиент службы: codeproject.com/KB/WCF/GeoNames-WCFClient. aspx Пользователь этого компонента впервые обнаружил эту ошибку, прочитайте ветку об ошибках десериализации внизу. Спасибо   -  person baretta    schedule 03.04.2009


Ответы (1)


Согласно спецификации JSON, число должно быть отформатировано с использованием точки. Другими словами, проблема не в части десериализатора, а в части сериализатора.

Если вам абсолютно необходимо использовать разделитель запятой, я бы рекомендовал настроить контракт, используя строку для типа свойства, и предоставить дополнительное свойство в вашем классе, которое не сериализовано, для преобразования строки в десятичное число (которое вы затем быть в состоянии передать любую культуру, в которой вы нуждались).

person Chris Shaffer    schedule 06.04.2009