#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, я внес следующие два изменения, которые сработали для меня.
- Свойства в классе, чтобы они соответствовали ключам в JSON
- Изменено
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, я внес следующие два изменения, которые сработали для меня.
- Свойства в классе, чтобы они соответствовали ключам в JSON
- Изменено
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; }
}