В .net MVC с JSON, как можно сериализовать целое число, начинающееся с 0, в качестве десятичного числа

#.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».

Я создал помощника для использования анонимных объектов, потому что мне надоело создавать классы для десериализатора.

Надеюсь, это поможет вашей ситуации, если это так, пожалуйста, не забудьте указать мой ответ в качестве ответа. Спасибо!