#.net #asp.net-mvc #json #serialization
#.net #asp.net-mvc #json #сериализация
Вопрос:
Сериализатор .net MVC 4 json по умолчанию — это класс JavaScriptSerializer. Это отлично сработало, но теперь мы поняли, что некоторые клиенты отправляют нам целое число с начальным 0, это рассматривается как восьмеричное число. Как мы можем справиться с этим?
Код уже используется многими людьми, поэтому мы не можем изменить int на строку, что, по-видимому, является одним из способов решения этой проблемы, но это не вариант, поскольку мы считаем, что изменение типа данных нарушит работу других реализаций, использующих наш код.
Мы подумали об изменении его, чтобы использовать json.net сериализатор, но, похоже, у этого сериализатора та же проблема.
например, 012 преобразуется в 10, когда мы передаем 012 в свойство int.
Есть идеи, как мы можем это исправить?
Комментарии:
1. Я не знаю, где используется сериализатор… Я не знаю, используете ли вы действия web api или MVC. Однако я могу только сказать вам, что JSON. Net допускает множество настроек, так что это похоже на то, как нужно следовать. JavaScriptSerializer «как есть, и вы ничего не можете с этим поделать»
Ответ №1:
Я не уверен, в чем именно заключается ваша проблема, не видя некоторого кода, но это то, что я делаю с десятичными числами (часть баланса кошелька пользователя / учетной записи) в приложении, над которым я сейчас работаю.
Модель
Public Class User
<Key>
Public Property id As Integer
Public Property FirstName As String
Public Property LastName As String
Public Property Phone As String
Public Property Address As String
Public Property City As String
Public Property State As String
Public Property ZipCode As String
Public Property AccountType As Integer
Public Property Email As String
Public Property Salt As String
Public Property Hash As Byte()
Public Property Company As String
Public Property ResetPassword As Boolean
Public Property Activated As Boolean
Public Property Balance As Decimal
Public Property Denied As Boolean
Public Property DeniedReason As String
Public Property AllowEmail As Boolean
Public Property AllowText As Boolean
Public Property NotifyJob As Boolean
Public Property NotifyMessage As Boolean
End Class
Обратите внимание, что баланс общедоступных свойств является десятичным
Теперь, для той части, где я получаю ввод JSON в контроллере, я создал для него «Вспомогательный класс» под названием streamJSON, который выполняет десериализацию для меня.
Вспомогательный класс
Public Class StreamJSON
Public Shared Function Fetch(Of Type)(ByVal SampleObject As Type) As Type
HttpContext.Current.Request.InputStream.Seek(0, IO.SeekOrigin.Begin)
Dim jsonstring As String = New IO.StreamReader(HttpContext.Current.Request.InputStream).ReadToEnd()
Return Newtonsoft.Json.JsonConvert.DeserializeAnonymousType(jsonstring, SampleObject)
End Function
End Class
Использование в контроллере выглядит следующим образом
Dim postedObj = StreamJSON.Fetch(New With {.userid=0,.amounttoadd=0d})
это дает мне десятичное значение для поля «amounttoadd».
Я создал помощника для использования анонимных объектов, потому что мне надоело создавать классы для десериализатора.
Надеюсь, это поможет вашей ситуации, если это так, пожалуйста, не забудьте указать мой ответ в качестве ответа. Спасибо!