Минимальное исправление, чтобы избежать ошибки maxJsonLength
, должно установить JavaScriptSerializer.MaxJsonLength = int.MaxValue
, как показано в в этом ответе в Длина строки превышает значение, установленное для свойства maxJsonLength по Таха Рехман Сиддики :
Dim serializer As JavaScriptSerializer = New JavaScriptSerializer()
serializer.MaxJsonLength = Int32.MaxValue
Dim dict As Object = serializer.Deserialize(Of List(Of Object))(JSonFilePath)
Однако в настоящее время вы загружаете файл размером 600 МБ в строку размером 600-1200 МБ, которая приближается к максимальной длине строки .Net . Если размер вашего файла несколько увеличится, вы начнете получать исключения из нехватки памяти. Лучшим подходом будет десериализация непосредственно из файла с использованием потокового решения, однако JavaScriptSerializer
не поддерживает потоковую передачу. Таким образом, я бы рекомендовал перейти на json.net , что делает.
Сначала установите Json.NET, как показано здесь . Далее, поскольку вы, кажется, не хотите определять явную модель данных для вашего JSON, создайте следующий статический метод:
Public Module JsonExtensions
Public Function LoadAnonymousType(Of T)(ByVal path as String, ByVal anonymousTypeObject as T, Optional ByVal settings as JsonSerializerSettings = Nothing) as T
Using streamReader As TextReader = File.OpenText(path)
Dim serializer = JsonSerializer.CreateDefault(settings)
return CType(serializer.Deserialize(streamreader, GetType(T)), T)
End Using
End Function
End Module
Для этого необходимо десериализовать содержимое файла, местоположение которого определяется аргументом path
, в модель данных типа, указанного в аргументе anonymousTypeObject
.
Теперь вы сможете десериализовать свой JSON непосредственно из файла в массив из объектов анонимного типа следующим образом:
Dim array = JsonExtensions.LoadAnonymousType( _
FileName, _
{ New With {.Email = CType(Nothing, String), .Timestamp = CType(Nothing, String), .Number = CType(Nothing, Long) }} _
)
For Each item In array
' DataGridView1.Rows.Add(item("EMail").ToString, item("Timestamp").ToString, item("Number").ToString)
Console.WriteLine("Email = {0}, Timestamp = {1}, Number = {2}", item.Email, item.Timestamp, item.Number)
Next
В качестве альтернативы вы можете создать явную модель данных следующим образом:
Public Class RootObject
Public Property Email As String
Public Property Timestamp As String
Public Property Number As Long
End Class
И десериализация, как показано в Десериализация JSON из файла :
Dim list As List(Of RootObject) = Nothing
Using streamReader As TextReader = File.OpenText(FileName)
list = CType(JsonSerializer.CreateDefault().Deserialize(streamReader, GetType(List(Of RootObject))), List(Of RootObject))
End Using
For Each item In list
' DataGridView1.Rows.Add(item("EMail").ToString, item("Timestamp").ToString, item("Number").ToString)
Console.WriteLine("Email = {0}, Timestamp = {1}, Number = {2}", item.Email, item.Timestamp, item.Number)
Next
Демонстрационная скрипка здесь .