Значение JSON не удалось преобразовать в системное.Коллекции.Общий.Список

#c# #json #generic-list

Вопрос:

Я пытаюсь составить список всех элементов в игре using System.Text.Json; , я очень новичок в использовании файлов .json. Я пытался сделать это, чтобы проверить, работает ли это:

             List<Item> AllItems = new List<Item>();
            string json = File.ReadAllText("Items.json");
            AllItems = Deserialize<List<Item>>(json);
            WriteLine(AllItems[0].Name);
 

Это не позволяет мне преобразовать его в список
Это файл json

 {
  "Item": [
    {
      "Weapon": [
        {
          "CritChance": 60,
          "HitChance": 80,
          "OGDamge": 15,
          "Damage": 15,
          "Damage_Type": "Physical",
          "Weapon_Type": "Fist",
          "Player": null,
          "APUsage": 4,
          "ID": 1,
          "Name": "Debug",
          "Value": 16,
          "Rarity": "Common",
          "Item_Type": "Weapon"
        },
        {
          "CritChance": 40,
          "HitChance": 70,
          "OGDamge": 15,
          "Damage": 15,
          "Damage_Type": "Electric",
          "Weapon_Type": "Bow",
          "Player": null,
          "APUsage": 5,
          "ID": 2,
          "Name": "Debug2",
          "Value": 15,
          "Rarity": "Common",
          "Item_Type": "Weapon"
        }
      ]
    }
  ]
}
 

Может ли кто-нибудь мне помочь 🙂

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

1. Вам нужно будет создать классы, представляющие эту структуру json. Проверьте QuickType ; у вас должен быть, по крайней мере Item , Weapon класс and. Вам также придется решить, какой тип Player будет учитывать это null .

2. Ваш список<Элемент> должен быть классом со свойством «Элемент», которое является списком<Элемент><Элемент>

3. @zaggler как именно я бы это сделал, лол, я не настолько продвинут на самом деле

4. @PrinceJKB пожалуйста, посмотрите ссылку, которую я разместил, возьмите свой json и вставьте его в редактор, он создаст для вас необходимые классы на основе этой структуры.

5. @zaggler должен ли я вставить это в visual studio или файл json

Ответ №1:

Ваш файл json начинается с фигурных скобок, что означает, что вам нужен родительский класс, содержащий список элементов с именем Item, Или вы просто меняете свой файл json, начинается с [ скобка, которая означает, что ваш основной объект-коллекция.

Ответ №2:

В приведенном ниже коде используется не файл, который вы используете, а строка (почти) с тем же содержимым. Вам необходимо объявить классы для каждого элемента в вашем Json, прежде чем вы сможете десериализоваться с помощью в данном случае NewtonSoft.

 using Newtonsoft.Json;
using System;
using System.Collections.Generic;

namespace JsonDeserialize
{
    class Program
    {
        static void Main(string[] args)
        {
            var json = @"
{
  'Items': [
    {
      'Weapons': [
        {
          'CritChance': 60,
          'HitChance': 80,
          'OGDamge': 15,
          'Damage': 15,
          'Damage_Type': 'Physical',
          'Weapon_Type': 'Fist',
          'Player': null,
          'APUsage': 4,
          'ID': 1,
          'Name': 'Debug',
          'Value': 16,
          'Rarity': 'Common',
          'Item_Type': 'Weapon'
        },
        {
          'CritChance': 40,
          'HitChance': 70,
          'OGDamge': 15,
          'Damage': 15,
          'Damage_Type': 'Electric',
          'Weapon_Type': 'Bow',
          'Player': null,
          'APUsage': 5,
          'ID': 2,
          'Name': 'Debug2',
          'Value': 15,
          'Rarity': 'Common',
          'Item_Type': 'Weapon'
        }
      ]
    }
  ]
}";

            var allItems = JsonConvert.DeserializeObject<AllItems>(json);
            Console.WriteLine(allItems.Items[0].Weapons[0].Name);
            Console.ReadKey();
        }
    }

    public class AllItems
    {
        public List<Item> Items { get; set; }
    }

    public class Item
    {
        public List<Weapon> Weapons { get; set; }
    }

    public class Weapon
    {
        public int CritChance { get; set; }
        public int HitChance { get; set; }
        public int OGDamge { get; set; }
        public int Damage { get; set; }
        public string Damage_Type { get; set; }
        public string Weapon_Type { get; set; }
        public string Player { get; set; }
        public int APUsage { get; set; }
        public string ID { get; set; }
        public string Name { get; set; }
        public int Value { get; set; }
        public string Rarity { get; set; }
        public string Item_Type { get; set; }
    }
}
 

Что всегда помогает мне в этих случаях, так это использование ключевого слова «динамический», например:

         dynamic allItems = JsonConvert.DeserializeObject<dynamic>(json);
 

Вы можете увидеть, что десериализуется с помощью «локальных»

введите описание изображения здесь

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

1. я все еще понятия не имею, что делать, лол, у меня есть класс предметов, а оружие-производный от него класс

2. Видите ли вы иерархию, которая находится в классах. Класс Allitems содержит список элементов. На предметах есть список оружия. Это именно то, о чем вы заявили в своем Json. Попробуйте прочитать код. Какую часть кода вы не понимаете? Не говори просто, что я не понимаю. Скажи нам, чего ты не понимаешь.