Не удается проанализировать JSON, сгенерированный PHP, в объект .NET. Всегда пусто

#asp.net #json #jsonserializer

Вопрос:

У меня есть несколько сгенерированных PHP данных JSON. Вот пример:

 [{
    "model": "XXXXX",
    "category": "Some Category",
    "description": "Hydrostatic",
    "id": "xyz123",
    "diagram": {
        "type": "Clutch",
        "name": "Clutch",
        "image": {
            "remote_url": "http://example.com/img/1565602310.png",
            "local_name": "diagram.png",
            "width": 919,
            "height": 668
        },
        "parts": [{
            "part": "010",
            "partNumber": "N22-45X",
            "partName": "Super clutch",
            "qty": 1,
            "ic": "",
            "weight": 1.848,
            "coords": {
                "xFrom": 552,
                "yFrom": 540,
                "xTo": 674,
                "yTo": 607
            }
        }]
    }
}]
 

Я пытаюсь встроить синтаксический ASP.NET 5.0 Core анализатор .

 string path = Path.Combine(Environment.WebRootPath, "data/data.json");
string strJson = System.IO.File.ReadAllText(path);
 

Приведенный выше основной фрагмент кода отлично извлекает строку JSON из файла. Теперь я пытаюсь преобразовать JSON в объект ModelData

 List<ModelData> md = JsonSerializer.Deserialize<List<ModelData>>(strJson);
List<ModelData> m_data = new List<ModelData>();
 

Но он всегда пуст.

ModelData Класс выглядит следующим образом:

 namespace ColemanData.Models
{
    public class ModelData
    {
        public string Model { get; set; }
        public string Category { get; set; }
        public string Description { get; set; }
        public string BookCD { get; set; }
        public Diagram Diagram { get; set; }
        public List<Part> Parts { get; set; }

    }

    public class Diagram
    {
        public string Type { get; set; }
        public string Name { get; set; }
        public DiagramImage Image { get; set; }
    }

    public class DiagramImage
    {
        public string RemoteUrl { get; set; }
        public float Width { get; set; }
        public float Height { get; set; }
        public string LocalName { get; set; }
    }

    public class Part
    {
        public string Label { get; set; }
        public string Number { get; set; }
        public string Name { get; set; }
        public int Quantity { get; set; }
        public string Ic { get; set; }
        public float Weight { get; set; }
        public Coordinates Coordinates { get; set; }
    }

    public class Coordinates
    {
        public float XStart { get; set; }
        public float YStart { get; set; }
        public float XEnd { get; set; }
        public float YEnd { get; set; }
    }
}
 

Обновить:
Взяв идею @sam-sj, я внес следующие два изменения, которые сработали для меня.

  1. Свойства в классе, чтобы они соответствовали ключам в JSON
  2. Изменено List<ModelData> md = JsonSerializer.Deserialize<List<ModelData>>(strJson); на var data = JsonConvert.DeserializeObject<List<ModelData>>(strJson);

И вот теперь я получаю желаемый объект. Это <List<ModelData>> необходимо, так как JSON заключен в квадратные скобки, т. Е. [ … ], что позволяет синтаксическому анализатору понять, что это массив.

Измененный класс теперь выглядит следующим образом:

 public class Image
    {
        public string remote_url { get; set; }
        public string local_name { get; set; }
        public int width { get; set; }
        public int height { get; set; }
    }

    public class Coords
    {
        public int xFrom { get; set; }
        public int yFrom { get; set; }
        public int xTo { get; set; }
        public int yTo { get; set; }
    }

    public class Part
    {
        public string part { get; set; }
        public string partNumber { get; set; }
        public string partName { get; set; }
        public int qty { get; set; }
        public string ic { get; set; }
        public string pin { get; set; }
        public string remarks { get; set; }
        public double lbs { get; set; }
        public Coords coords { get; set; }
    }

    public class Diagram
    {
        public string type { get; set; }
        public string name { get; set; }
        public Image image { get; set; }
        public List<Part> parts { get; set; }
    }

    public class Root
    {
        public string model { get; set; }
        public string category { get; set; }
        public string description { get; set; }
        public string id{ get; set; }
        public Diagram diagram { get; set; }
    }
 

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

1. Я не думаю, что сериализатор JSON может разбить данные JSON на несколько элементов списка, как вы пытаетесь сделать. Я бы, возможно, попытался создать новый класс, который представляет все данные из входных данных JSON в виде списка, а затем десериализует весь объект JSON как один в этот новый класс.

2. Спасибо! Не могли бы вы помочь мне с примером кода или направить меня на аналогичный учебник, пожалуйста?

3. @sam-sjs, спасибо, что наставил меня на правильный путь. Я обновил свой пост рабочим решением!

4. Привет @SubrataSarkar, приятно видеть, что вы получили правильный ответ. Тем временем, пожалуйста, добавьте решение в качестве ответа , но не ставьте его под сомнение и примите его. Спасибо.

5. @YongShun Я добавил решение в качестве ответа. Надеюсь, это сработает! Спасибо вам за ваше руководство.

Ответ №1:

Взяв идею @sam-sj, я внес следующие два изменения, которые сработали для меня.

  1. Свойства в классе, чтобы они соответствовали ключам в JSON
  2. Изменено List<ModelData> md = JsonSerializer.Deserialize<List<ModelData>>(strJson); на var data = JsonConvert.DeserializeObject<List<ModelData>>(strJson);

И вот теперь я получаю желаемый объект. Это <List<ModelData>> необходимо, так как JSON заключен в квадратные скобки, т. Е. [ … ], что позволяет синтаксическому анализатору понять, что это массив.

Измененный класс теперь выглядит следующим образом:

 public class Image
    {
        public string remote_url { get; set; }
        public string local_name { get; set; }
        public int width { get; set; }
        public int height { get; set; }
    }

    public class Coords
    {
        public int xFrom { get; set; }
        public int yFrom { get; set; }
        public int xTo { get; set; }
        public int yTo { get; set; }
    }

    public class Part
    {
        public string part { get; set; }
        public string partNumber { get; set; }
        public string partName { get; set; }
        public int qty { get; set; }
        public string ic { get; set; }
        public string pin { get; set; }
        public string remarks { get; set; }
        public double lbs { get; set; }
        public Coords coords { get; set; }
    }

    public class Diagram
    {
        public string type { get; set; }
        public string name { get; set; }
        public Image image { get; set; }
        public List<Part> parts { get; set; }
    }

    public class Root
    {
        public string model { get; set; }
        public string category { get; set; }
        public string description { get; set; }
        public string id{ get; set; }
        public Diagram diagram { get; set; }
    }