Не удается преобразовать JSON в класс C#

#c# #json.net

Вопрос:

У меня возникли некоторые проблемы с преобразованием ответа JSON в класс C#.

Я получаю следующий ответ JSON в строковом объекте:

 "[{"slaveId":31,"funcCode":3,"address":86,"quantity":2,"data":[4,30,241,73,0]}]"
 

Я проверил формат на этом веб-сайте , строка является допустимым форматом JSON.

Я преобразовал приведенный выше ответ в класс C# с помощью json2csharp и получил следующий код:

 // Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); 
public class MyArray
{
    public int slaveId { get; set; }
    public int funcCode { get; set; }
    public int address { get; set; }
    public int quantity { get; set; }
    public List<int> data { get; set; }
}

public class Root
{
    public List<MyArray> MyArray { get; set; }
}
 

Я добавил приведенный выше код в свой проект, конечный результат таков:

 using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;

namespace ModbusJsonTest
{
    class Program
    {
        static void Main(string[] args)
        {
        const int PORT_NO = 30001;
        const string SERVER_IP = "192.168.1.1";

        //---data to send to the server---

        StringBuilder request = new();
        request.Append("{");
        request.Append(""funcCode":3,");
        request.Append(""slaveId":31,");
        request.Append(""address":86,");
        request.Append(""quantity":2,");
        request.Append(""interval":0");
        request.Append("}");


        //---create a TCPClient object at the IP and port no.---
        TcpClient client = new TcpClient(SERVER_IP, PORT_NO);
        NetworkStream nwStream = client.GetStream();
        byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes(request.ToString());

        //---send the text---
        Console.WriteLine("Sending : "   request.ToString()   "/n");
        nwStream.Write(bytesToSend, 0, bytesToSend.Length);

        //---read back the text---
        byte[] bytesToRead = new byte[client.ReceiveBufferSize];
        int bytesRead = nwStream.Read(bytesToRead, 0, client.ReceiveBufferSize);
        string myJsonResponse = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead);
        Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);

        client.Close();
    }


}

// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); 
public class MyArray
{
    public int slaveId { get; set; }
    public int funcCode { get; set; }
    public int address { get; set; }
    public int quantity { get; set; }
    public List<int> data { get; set; }
}

public class Root
{
    public List<MyArray> MyArray { get; set; }
}
 

К сожалению, код обрывается в этой строке (в разделе //—прочитайте текст — — -):

 Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);
 

Я получаю следующую ошибку:

Ньютонсофт.Json.Исключение JsonSerializationException: ‘Не удается десериализовать текущий массив JSON (например, [1,2,3]) в тип ‘ModbusJsonTest.Root’, поскольку для правильной десериализации типа требуется объект JSON (например, {«имя»:»значение»}). Чтобы исправить эту ошибку, измените JSON на объект JSON (например, {«имя»:»значение»}) или измените десериализованный тип на массив или тип, реализующий интерфейс коллекции (например, ICollection, IList), подобный списку, который может быть десериализован из массива JSON. Атрибут JsonArrayAttribute также можно добавить к типу, чтобы принудительно десериализовать его из массива JSON. Путь «, строка 1, позиция 1.’

Я попытался немного поиграть со строкой формата JSON, удалив пробелы, используя «имя»:формат значения вместо «имя»:формат значения и т. Д… тоже не сработало.

Я не могу понять, что я делаю не так?

У меня такое чувство, что я все сделал по инструкции…

Любые примеры кода/предложения, которые я могу попробовать ?

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

1. Корень в вашем JSON-это массив, поэтому ваш корень в C# должен быть типом коллекции (список, перечисляемый, массив и т. Д.). Это так просто.

2. Вам просто нужен JsonConvert. Вместо этого десериализуйте объект<List<myArray><myArray>>(myJsonResponse).

3. Если Root он создан только для десериализации, вы должны игнорировать его. И десериализовать список элементов myArray. var myDeserializedClass = JsonConvert.DeserializeObject<List<MyArray>>(myJsonResponse);

4. Если вы используете Newtonsoft, то вы можете просто манипулировать им как JArray .

5. @ЛеВу, пожалуйста, добавьте свое предложение в качестве ответа, оно сработало, я приму его, спасибо !

Ответ №1:

Класс Root определен только для целей десериализации массива. Тогда мы сможем использовать Json.СЕТЕВАЯ функция. Джсон.NET поддерживает встроенную десериализацию списков для List , Array , Collection

 var myDeserializedClass = JsonConvert.DeserializeObject<List<MyArray>>();