Ошибка десериализации JSON в службах перевода Azure

#json #vb.net #winforms #azure #azure-cognitive-services

#json #vb.net #winforms — формы #azure #azure-когнитивные службы

Вопрос:

Я создаю программу в Visual Studio 2017 в Windows Forms — извините, но это единственное, что я знаю, как использовать — во всяком случае, почти все для этого — C #, поэтому у меня возникли проблемы с получением помощи.

Я перевел предоставленный Microsoft пример для программы на C # для подключения к службам когнитивного перевода Azure, зарегистрировался, получил все свои ключи и т. Д.

Когда я запускаю код, я получаю следующую ошибку:

Newtonsoft.Json.Исключение JsonSerializationException:
«Не удается десериализовать текущий объект JSON (например, {«name»:»value»}) в тип System.Коллекции.Generic.List 1[System.Collections.Generic.Dictionary 2[System.Строка, система.Коллекции.Generic.List 1[System.Collections.Generic.Dictionary 2[System.Строка, система.Строка]]]]’ потому что для правильной десериализации типа требуется массив JSON (например, [1,2,3] ).
Чтобы исправить эту ошибку, либо измените JSON на массив JSON (например, [1,2,3] ), либо измените десериализованный тип так, чтобы это был обычный тип .NET (например, не примитивный тип, такой как integer, а не тип коллекции, такой как array или List), который можно десериализовать из объекта JSON. Атрибут JsonObjectAttribute также может быть добавлен к типу, чтобы заставить его десериализоваться из объекта JSON. Ошибка пути, строка 1, позиция 9.’

Я перепробовал слишком много вещей для перечисления из разных источников. Я не очень много знаю о JSON и прошу помощи с кодом для решения вышеуказанной проблемы.

 Public Class DetectedLanguage
    Public Property language As String
    Public Property score As Double
End Class

Public Class Translation
    Public Property text As String
    Public Property two As String
End Class

Public Class Example
    Public Property detectedLanguage As DetectedLanguage
    Public Property translations As Translation()
End Class

Dim textToTranslate As String = root
Dim fromLanguage As String
Dim fromLanguageCode As String = cabbr

Dim toLanguageCode As String = "en"

Dim endpoint As String = String.Format(TEXT_TRANSLATION_API_ENDPOINT, "translate")
Dim uri As String = String.Format(endpoint amp; "amp;from={0}amp;to={1}", fromLanguageCode, toLanguageCode)
Dim body As System.Object() = New System.Object() {New With {Key .Text = textToTranslate}}
Dim requestBody = JsonConvert.SerializeObject(body)

Using client = New HttpClient()
    Using request = New HttpRequestMessage()
        request.Method = HttpMethod.Post
        request.RequestUri = New Uri(uri)
        request.Content = New StringContent(requestBody, Encoding.UTF8, "application/json")
        request.Headers.Add("Ocp-Apim-Subscription-Key", COGNITIVE_SERVICES_KEY)
        request.Headers.Add("Ocp-Apim-Subscription-Region", "westus")
        request.Headers.Add("X-ClientTraceId", Guid.NewGuid().ToString())
        Dim response = client.SendAsync(request).Result
        Dim responseBody = response.Content.ReadAsStringAsync().Result
        Dim result = JsonConvert.DeserializeObject(Of List(Of Dictionary(Of String, List(Of Dictionary(Of String, String)))))(responseBody)
        Dim translation = result(0)("translations")(0)("text")
        rtRoot.Text = translation
    End Using
End Using
 

Я уже использовал jsonutil сайт, чтобы вставить свой код JSON и получить классы.

Вот мое содержимое JSON:

 [
   {
      "detectedLanguage":{
         "language":"nl",
         "score":1.0
      },
      "translations":[
         {
            "text":"bord vervangen en uitvoerig getest",
            "to":"nl"
         },
         {
            "text":"Board replaced and tested extensively",
            "to":"en"
         }
      ]
   }
]
 

Комментарии:

1. Можете ли вы показать нам, как responseBody это выглядит? Также JsonConvert.DeserializeObject(Of Example)(responseBody) работает?

2. Изменение Public Property translations As Translation() Public Property translations As List(Of Translation) . Затем, Dim result = JsonConvert.DeserializeObject(Of List(Of Example))(responseBody)

3. спасибо вам обоим за ответы — responsebody — это, по сути, просто содержимое JSON: [{«Обнаруженный язык»: {«язык»:»nl», «оценка»: 1.0}, «переводы»: [{«текст»: «bord vervangen en uitvoerig getest»,»кому»:»nl»},{«текст»:»Плата заменена и тщательно протестирована»,»кому»:»ru»}]}]

4. когда я обновляю код до вашего, Jimi, я получаю сообщение об ошибке в следующей строке в разделе результат (0) = не может быть проиндексирован, поскольку у него нет свойства по умолчанию.

5. ХОРОШО!!! после игры с этим — Jimi — ваше решение сработало!!! большое вам спасибо! мне пришлось удалить следующие строки: запрос. Запрос Headers.Add («Ocp-Apim-Subscription-Region», «westus»). Headers.Add(«X-ClientTraceId», Guid. NewGuid(). toString())

Ответ №1:

ХОРОШО!!! после игры с этим — Jimi — ваше решение сработало!!! большое вам спасибо! мне пришлось удалить следующие строки: запрос.Запрос Headers.Add («Ocp-Apim-Subscription-Region», «westus»).Headers.Add(«X-ClientTraceId», Guid.NewGuid().toString())