Проблемы с доступом к массиву в ответе JSON - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь получить доступ к массиву в ответе JSON и получаю следующую ошибку:

JsonSerializationException: Невозможно десериализовать текущий объект JSON (например, {"name": "value"})в тип 'System.Collections.Generic.List`1 [Charts.Models.software]', поскольку для корректной десериализации тип требует массив JSON (например, [1,2,3]).

SoftInfo = JsonConvert.DeserializeObject<List<software>>(SoftResponse);

public class software 
{
    [JsonProperty("softwares")]
    public string name { get; set; }
    public string version { get; set; }
    public string fixVersion { get; set; }
    public string vulnerabilities { get; set; }
}

<tr>
    <th>
        @Html.DisplayNameFor(model => model.name)  
    </th>
    <th>
        @Html.DisplayNameFor(model => model.version) 
    </th>
    <th>
        @Html.DisplayNameFor(model => model.fixVersion)  
    </th>
    <th class="text-center">
        @Html.DisplayNameFor(model => model.vulnerabilities)
    </th>
</tr>

</thead>
<tbody>
@foreach (var item in Model) {  
<tr>  
    <td>  
        @Html.DisplayFor(modelItem => item.name)  
    </td>  
    <td>  
        @Html.DisplayFor(modelItem => item.version)  
    </td>
    <td>  
        @Html.DisplayFor(modelItem => item.fixVersion)  
    </td>  
    <td>  
        @Html.DisplayFor(modelItem => item.vulnerabilities)  
    </td>  
</tr>

Изображение структуры JSON

Ответы [ 4 ]

1 голос
/ 19 октября 2019

Убедитесь, что SoftResponse является массивом, прежде чем использовать любой из списков ... массив JSON обычно имеет формат [{softwares, version, fixVersion, vulnerabilities}, {softwares, version, fixVersion, vulnerabilities}]. если ваш ответ имеет формат {softwares, version, fixVersion, vulnerabilities}, то это объект, а не массив.

Если одно из ваших свойств, например softwares, имеет формат массива, убедитесь, что вы используете списоквведите в своем классе, как:

public class software 
{
    [JsonProperty("softwares")]
    public List<string> name { get; set; }
    public string version { get; set; }
    public string fixVersion { get; set; }
    public string vulnerabilities { get; set; }
}
0 голосов
/ 21 октября 2019

Глядя на прикрепленное изображение, ваш JSON имеет свойство softwares, которое является массивом software, поэтому ваш класс, в который вы десериализуетесь, должен имитировать ту же структуру.

Класс, который представляет Ответ

public class Response
{
   public List<software> softwares{ get; set; }
}

Класс для программного обеспечения, тот, который у вас уже есть

public class software 
{
    public string name { get; set; }
    public string version { get; set; }
    public string fixVersion { get; set; }
    public string vulnerabilities { get; set; }
}
var data = JsonConvert.DeserializeObject<Response>(yourJSONstring);

Теперь у Response есть свойство softwares, которое можно использовать для запроса индивидуального software

0 голосов
/ 19 октября 2019

Вы уверены, что SoftResponse - это массив Json? Можете ли вы попытаться хотя бы сначала оценить SoftReponse? Возможно, список программного обеспечения является вложенным свойством SoftResponse.

В Visual Studio есть функция под названием Вставить JSON в классы .

image Paste > Paste JSON as Classes">

Скопируйте значение SoftResponse, оценив его в режиме отладки, и используйте функцию Paste JSON as Classes для генерации классов.

0 голосов
/ 19 октября 2019

Изменить строку:

SoftInfo = JsonConvert.DeserializeObject<List<software>>(SoftResponse);

на:

SoftInfo = JsonConvert.DeserializeObject<software>(SoftResponse);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...