MaverickSingh Ответов: 1

Проблема форматирования JSON - разбор файла JSON в VB.NET


Я использую "System.Text.Json". Файл JSON содержит несколько значений, разделенных запятыми, код работает только для одного блока данных Json. Если я использую все данные целиком, он не анализирует их и выдает мне исключение о '[' и ','. Чего не должно быть, разве я что-то упускаю? Пожалуйста, смотрите приведенный ниже код и данные Json

Вот мой код для этого класса:

Public Class query
    Public Property RN As String
    Public Property QUERY_ID As String
    Public Property QTYPE As String
    Public Property SENDERNAME As String
    Public Property SENDEREMAIL As String
    Public Property SUBJECT As String
    Public Property DATE_RE As String
    Public Property DATE_R As String
    Public Property DATE_TIME_RE As String
    Public Property GLUSR_USR_COMPANYNAME As String
    Public Property READ_STATUS As Object
    Public Property SENDER_GLUSR_USR_ID As Object
    Public Property MOB As String
    Public Property COUNTRY_FLAG As String
    Public Property QUERY_MODID As String
    Public Property LOG_TIME As String
    Public Property QUERY_MODREFID As Object
    Public Property DIR_QUERY_MODREF_TYPE As Object
    Public Property ORG_SENDER_GLUSR_ID As Object
    Public Property ENQ_MESSAGE As String
    Public Property ENQ_ADDRESS As String
    Public Property ENQ_CALL_DURATION As Object
    Public Property ENQ_RECEIVER_MOB As Object
    Public Property ENQ_CITY As String
    Public Property ENQ_STATE As String
    Public Property PRODUCT_NAME As String
    Public Property COUNTRY_ISO As String
    Public Property EMAIL_ALT As String
    Public Property MOBILE_ALT As String
    Public Property PHONE As Object
    Public Property PHONE_ALT As Object
    Public Property IM_MEMBER_SINCE As Object
    Public Property TOTAL_COUNT As String
End Class
Основной код формы:
Imports System.IO
Imports System.Text.Json
Imports System.Text.Json.Serialization

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim json As String = 
        File.ReadAllText("~\test2.txt")
        Dim feed = JsonSerializer.Deserialize(Of query)(json)
        MsgBox(feed.ENQ_MESSAGE)
    End Sub

End Class
Вот данные JSON
[
    {
        "RN": "1",
        "QUERY_ID": "1519852833",
        "QTYPE": "W",
        "SENDERNAME": "Name1",
        "SENDEREMAIL": "xyz@gmail.com",
        "SUBJECT": "Requirement for Black PP Granules",
        "DATE_RE": "30 Sep 2020",
        "DATE_R": "30-Sep-20",
        "DATE_TIME_RE": "30-Sep-2020 11:34:46 PM",
        "GLUSR_USR_COMPANYNAME": "Company Name1",
        "READ_STATUS": null,
        "SENDER_GLUSR_USR_ID": null,
        "MOB": "+91-1111111111",
        "COUNTRY_FLAG": "",
        "QUERY_MODID": "DIRECT",
        "LOG_TIME": "20200930233446",
        "QUERY_MODREFID": null,
        "DIR_QUERY_MODREF_TYPE": null,
        "ORG_SENDER_GLUSR_ID": null,
        "ENQ_MESSAGE": "My Requirement is for Black PP Granules.",
        "ENQ_ADDRESS": "Address1",
        "ENQ_CALL_DURATION": null,
        "ENQ_RECEIVER_MOB": null,
        "ENQ_CITY": "Panipat",
        "ENQ_STATE": "Haryana",
        "PRODUCT_NAME": "Black PP Granules",
        "COUNTRY_ISO": "IN",
        "EMAIL_ALT": "xyz11@gmail.com",
        "MOBILE_ALT": "+91-11111111111",
        "PHONE": null,
        "PHONE_ALT": null,
        "IM_MEMBER_SINCE": null,
        "TOTAL_COUNT": "178"
    },
    {
        "RN": "2",
        "QUERY_ID": "1519834488",
        "QTYPE": "W",
        "SENDERNAME": "Name2",
        "SENDEREMAIL": "xyz2@gmail.com",
        "SUBJECT": "Requirement for SHRILON Nylon  Granules",
        "DATE_RE": "30 Sep 2020",
        "DATE_R": "30-Sep-20",
        "DATE_TIME_RE": "30-Sep-2020 11:04:12 PM",
        "GLUSR_USR_COMPANYNAME": "Company Name2",
        "READ_STATUS": null,
        "SENDER_GLUSR_USR_ID": null,
        "MOB": "+91-22222222222",
        "COUNTRY_FLAG": "",
        "QUERY_MODID": "DIRECT",
        "LOG_TIME": "20200930230412",
        "QUERY_MODREFID": null,
        "DIR_QUERY_MODREF_TYPE": null,
        "ORG_SENDER_GLUSR_ID": null,
        "ENQ_MESSAGE": "Requirement2",
        "ENQ_ADDRESS": "Address2",
        "ENQ_CALL_DURATION": null,
        "ENQ_RECEIVER_MOB": null,
        "ENQ_CITY": "Chennai",
        "ENQ_STATE": "Tamil Nadu",
        "PRODUCT_NAME": "SHRILON Nylon  Granules",
        "COUNTRY_ISO": "IN",
        "EMAIL_ALT": null,
        "MOBILE_ALT": "+912222222",
        "PHONE": null,
        "PHONE_ALT": null,
        "IM_MEMBER_SINCE": null,
        "TOTAL_COUNT": "178"
    }
]


Что я уже пробовал:

Я попытался подтвердить формат данных Json. Json является правильным и допустимым (RFC8259). Чтобы заставить это работать, я должен удалить '[]' и использовать только один блок данных внутри '{}'. Если я использую все данные целиком, он не анализирует их и выдает мне исключение о '[' и ','.

Я также попробовал Newtonsoft Json и столкнулся с той же проблемой.

Sandeep Mewara

2 вещи:
1. Вы проверили весь json, а не только один блок, что форматирование JSON является хорошим. Если нет, то я бы предложил использовать любой онлайн-инструмент, чтобы быстро проверить, является ли весь json допустимым json. (https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwi30fuqwZrsAhWD7HMBHVNMBRkqfjaaegqiahac&url=https%3A%2F%2Fjsonlint.com%2F&usg=AOvVaw1wm0AnA86fJrIoZRGRzp6P)
2. было бы полезно, если бы вы поделились точной ошибкой, которую вы получаете, и любой трассировкой стека для справки.

MaverickSingh

1. Я проверила весь JSON, а не просто заблокировать. результат возвращает допустимый json.
2. вот ошибка : системе.Текст.В формате JSON.JsonException: 'значение JSON не может быть преобразовано в ExportToExcel.запрос. Путь: $ | LineNumber: 0 | BytePositionInLine: 1.'

Richard MacCutchan

Каково точное сообщение? Глядя на ваши данные, кажется, что перед открывающейся квадратной скобкой отсутствует какой-то элемент, что-то вроде "{"mydata":"что указывает на массив наборов JSON.

MaverickSingh

Системы.Текст.В формате JSON.JsonException: 'значение JSON не может быть преобразовано в ExportToExcel.запрос. Путь: $ | LineNumber: 0 | BytePositionInLine: 1.'

MaverickSingh

это возврат JSON с помощью API. Я должен проверить все данные Json на https://jsonformatter.curiousconcept.com/ и он говорит, что json действителен (RFC8259)

MaverickSingh

Вот полный текст сообщения об ошибке:

Системы.Текст.В формате JSON.Исключение JsonException
HResult=0x80131500
Message=значение JSON не может быть преобразовано в ExportToExcel.запрос. Путь: $ | LineNumber: 0 | BytePositionInLine: 1.
Источник=Система.Текст.В JSON
Трассировка стека:
в System.Text.Json.Метательница.ThrowJsonException_DeserializeUnabletoconvertvalue(тип propertyType)
в System.Text.Json.JsonSerializer.HandleStartArray(JsonSerializerOptions вариантов, Utf8JsonReader&амп; читатель, ReadStack&амп; государство)
в System.Text.Json.JsonSerializer.ReadCore(JsonSerializerOptions вариантов, Utf8JsonReader&амп; читатель, ReadStack&амп; readStack)
в System.Text.Json.JsonSerializer.ReadCore(тип_возвращаемого_значения типа, JsonSerializerOptions вариантов, Utf8JsonReader&амп; читатель)
в System.Text.Json.JsonSerializer.Десериализовать(JSON-строку, тип_возвращаемого_значения типа, JsonSerializerOptions варианты)
в System.Text.Json.JsonSerializer.Десериализация[TValue](String json, JsonSerializerOptions options)
в ExportToExcel.Form1.Button1_Click(отправитель объекта, EventArgs e) в H:\Dotnet_projects\ExportToExcel\Form1.vb:line 13.
в системе.Окна.Формы.Контроль.OnClick(EventArgs e)
в системе.Окна.Формы.Кнопка.OnClick(EventArgs e)
в системе.Окна.Формы.Кнопка.OnMouseUp(MouseEventArgs mevent)
в системе.Окна.Формы.Контроль.WmMouseUp(Message& m, кнопка MouseButtons, Int32 клика)
в системе.Окна.Формы.Контроль.WndProc(сообщение& m)
в системе.Окна.Формы.ButtonBase.WndProc(сообщение& m)
в системе.Окна.Формы.Кнопка.WndProc(сообщение& m)
в системе.Окна.Формы.Контроль.ControlNativeWindow.OnMessage(сообщение& m)
в системе.Окна.Формы.Контроль.ControlNativeWindow.WndProc(сообщение& m)
в системе.Окна.Формы.Родное окно.DebuggableCallback(hwnd элемента указателя IntPtr, int32 и глутамат натрия, указателя IntPtr параметр wparam, указателя IntPtr lparam должен)
в системе.Окна.Формы.Небезопасные методы.DispatchMessageW(MSG& msg)
в системе.Окна.Формы.Приложение.ComponentManager.Система.Окна.Формы.Небезопасные методы.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
в системе.Окна.Формы.Приложение.ThreadContext.RunMessageLoopInner(Int32 причина, контекст ApplicationContext)
в системе.Окна.Формы.Приложение.ThreadContext.RunMessageLoop(Int32 причина, контекст ApplicationContext)
в корпорации Microsoft.На языке VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Онран()
в корпорации Microsoft.На языке VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
в корпорации Microsoft.На языке VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(строка[] командная строка)
в ExportToExcel.My.MyApplication.Main(String[] Args) in :строка 81

Это исключение было первоначально брошено в этот стек вызовов:
[внешний код]
ExportToExcel.Form1.Button1_Click(Объект, Система.EventArgs) в Form1.vb
[внешний код]

1 Ответов

Рейтинг:
6

OriginalGriff

Ну да. А чего ты ожидал?
Вы предоставляете массив JSON из двух элементов данных и говорите ему десериализовать их в один экземпляр:

Dim feed = JsonSerializer.Deserialize(Of query)(json)
Если вы скажете ему это массив:
Dim feed = JsonSerializer.Deserialize(Of query())(json)
Тогда это сработает.
Но ваш MsgBox потерпит неудачу.

Пожалуйста, прекратите использовать устаревший код VB: MsgBox предназначен для совместимости с устаревшим VB6, который умер в 2004 году ... используйте MessageBox.Покажи вместо этого.


MaverickSingh

Спасибо. Это сработало. Окно сообщения предназначено только для того, чтобы увидеть данные, я буду конвертировать их в файл Excel.

OriginalGriff

Всегда пожалуйста!