У меня есть очень простой файл JSON:
[
{
"smbshare": {
"name": "Backup",
"path": "\\linuxserver\backup"
},
"smbshare2": {
"name": "Tools",
"path": "\\linuxserver\tools"
}
}
]
Мой модельный класс:
public class SmbShare
{
[JsonProperty("name")]
public string Name { get;set; }
[JsonProperty("path")]
public string Path { get; set; }
}
И SmbController
public class SmbController : Controller
{
public ActionResult Index()
{
using (StreamReader r = new StreamReader("smbshares.json"))
{
string json = r.ReadToEnd();
List<SmbShare> items = JsonConvert.DeserializeObject<List<SmbShare>>(json);
}
}
}
Список items
содержит только один объект, но с пустыми значениями (null/0).
Любые подсказки, почему сопоставление не работает?
Класс не соответствует вашему JSON. Вы десериализуете массив одного объекта с двумя свойствами, smbshare
и smbshare2
. Сериализатор не знает, что вы хотите, чтобы это были элементы массива. Чтобы получить ожидаемый результат, вам придется использовать пользовательский JsonConverter для достижения желаемого поведения.
У вас есть несоответствие между вашим JSON и вашей структурой данных:
List<SmbShare>
будет представлен в формате JSON следующим образом:
[
{
"name": "Backup",
"path": "\\linuxserver\backup"
},
{
"name": "Tools",
"path": "\\linuxserver\tools"
}
]
Вам нужно либо обновить файл JSON, либо структуру данных.
Ваш JSON представляет не List<SmbShare>
, а список объектов, содержащих SmbShare
свойства. Один из способов справиться с этим — использовать Dictionary<string, SmbShare>
(в противном случае вам понадобится класс со свойствами smbshare
и smbshare2
):
var json = """
[
{
"smbshare": {
"name": "Backup",
"path": "\\linuxserver\backup"
},
"smbshare2": {
"name": "Tools",
"path": "\\linuxserver\tools"
}
}
]
""";
var list = JsonConvert.DeserializeObject<List<Dictionary<string, SmbShare>>>(json);
Console.WriteLine(list.First().First().Value.Name); // Prints "Backup"
Или, если можете, просто исправьте JSON так:
[
{
"name": "Backup",
"path": "\\linuxserver\backup"
},
{
"name": "Tools",
"path": "\\linuxserver\tools"
}
]
Затем он будет правильно десериализован в List<SmbShare>
.
«Чтобы получить ожидаемый результат, вам придется использовать собственный JsonConverter» — есть более простые варианты решения ситуации, чем использование пользовательского конвертера.