Я работал над проектом C #, в котором мне нужно было вызвать API и проанализировать ответ JSON.

Ответ JSON:

{
    "version": "3.9.1",
     "data": {
        "obj1": {
            "version": "1.0.0",
            "id": "obj1",
            "name": "Object 1",
            "title": "Object 1",
            "info": {
                "info1": 8,
                "info2": 4,
                "info3": 3
            },
            "image": {
                "full": "Object1.png",
                "w": 64,
                "h": 64
            },
            "tags": [
                "Tag1",
                "Tag2"
            ]
        },
        "obj2": {
            "version": "1.0.0",
            "id": "obj2",
            "name": "Object 2",
            "title": "Object 2",
            "info": {
                "info1": 1,
                "info2": 6,
                "info3": 7
            },
            "image": {
                "full": "Object2.png",
                "w": 64,
                "h": 64
            },
            "tags": [
                "Tag1",
                "Tag6"
            ]
        },
        "obj3": {
            "version": "1.0.0",
            "id": "obj3",
            "name": "Object 3",
            "title": "Object 3",
            "info": {
                "info1": 0,
                "info2": 1,
                "info3": 2
            },
            "image": {
                "full": "Object3.png",
                "w": 64,
                "h": 64
            },
            "tags": [
                "Tag7",
                "Tag8"
            ]
        }
    }
}

С помощью этого ответа я хочу перебрать все объекты, расположенные внутри «данных». Количество объектов внутри «данных» не всегда одно и то же, возможно, что внутри находится только 1 объект или 10 объектов.

Проблема, с которой я столкнулся, заключается в том, что я не могу выполнить цикл из-за следующей ошибки: foreach statement cannot operate on variables of type 'Objects' because 'Objects' does not contain a public instance or extension definition for 'GetEnumerator'

Я знаю, почему получаю сообщение об ошибке, но не могу найти способ исправить свою проблему.

Мой код:

MainWindow.xaml.cs

WebRequest request = WebRequest.Create(path);
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());

string ReaderJson = reader.ReadToEnd();

var JsonResponse = JsonConvert.DeserializeObject<Response>(ReaderJson);


foreach (var obj in JsonResponse.data)
{
    Console.WriteLine(obj.ToString());
}

JsonParser.cs

    public class Response
    {
        public string version { get; set; }
        public Objects data { get; set; }
    }

    public class Objects
    {
        public string id { get; set; }
        public string name { get; set; }
        public string title { get; set; }
        public Info info { get; set; }
        public Images images { get; set; }
    }

    public class Info
    {
        public int info1 { get; set; }
        public int info2 { get; set; }
        public int info3 { get; set; }
    }

    public class Images
    {
        public string full { get; set; }
        public int w { get; set; }
        public int h { get; set; }
    }

Как я могу перебрать все объекты внутри «данных», не вызывая их с помощью «obj1» или «obj2»?

Заранее спасибо!

0
MrMilkshake 3 Май 2021 в 23:20

3 ответа

Лучший ответ

Проблема здесь в том, что ваша схема JSON определяет dictionary для data, но ваше data свойство возвращает < strong> единственный экземпляр вашего класса Objects.

Модель данных

Вам нужно, чтобы ваш класс Response выглядел примерно так:

public class Response
{
    public string version { get; set; }
    public Dictionary<string, Objects> data { get; set; }
}

В остальном все должно быть хорошо.

Цикл по данным

Учитывая вышеизложенное, теперь вы можете перемещаться по словарю data, используя что-то вроде:

foreach (var obj in JsonResponse.data)
{
    Console.WriteLine(obj.Key);
}

Примечание. При циклическом прохождении Dictionary<TKey, TValue> будет возвращено перечисление KeyValuePair<TKey, TValue> с вашим ключом (т. е. obj1) в {{X3} } и ваш объект в свойстве Value.

Соглашения об именах

Очевидно, что имя Objects здесь не имеет смысла, поскольку оно представляет собой отдельный объект, а не набор объектов. Я сохраню его Objects для согласованности с вашим кодом, но вы захотите дать ему уникальное имя. Я предполагаю, что это просто осталось от того, что вы хотели, чтобы он представлял коллекцию.

1
Jeremy Caney 3 Май 2021 в 21:11

Я предполагаю, что данные - это не то, что вы думаете. Похоже, что данные - это объект, а не коллекция.

0
Grant 3 Май 2021 в 20:30

Если у obj1, obj2 и obj3 есть эти имена Правильный объект преобразования

public class Info
    {
        public int info1 { get; set; }
        public int info2 { get; set; }
        public int info3 { get; set; }
    }

    public class Image
    {
        public string full { get; set; }
        public int w { get; set; }
        public int h { get; set; }
    }

    public class Obj1
    {
        public string version { get; set; }
        public string id { get; set; }
        public string name { get; set; }
        public string title { get; set; }
        public Info info { get; set; }
        public Image image { get; set; }
        public List<string> tags { get; set; }
    }

    public class Obj2
    {
        public string version { get; set; }
        public string id { get; set; }
        public string name { get; set; }
        public string title { get; set; }
        public Info info { get; set; }
        public Image image { get; set; }
        public List<string> tags { get; set; }
    }

    public class Obj3
    {
        public string version { get; set; }
        public string id { get; set; }
        public string name { get; set; }
        public string title { get; set; }
        public Info info { get; set; }
        public Image image { get; set; }
        public List<string> tags { get; set; }
    }

    public class Data
    {
        public Obj1 obj1 { get; set; }
        public Obj2 obj2 { get; set; }
        public Obj3 obj3 { get; set; }
    }

    public class Result
    {
        public string version { get; set; }
        public Data data { get; set; }
    }

В противном случае объект должен быть списком

public class Info
    {
        public int info1 { get; set; }
        public int info2 { get; set; }
        public int info3 { get; set; }
    }

    public class Image
    {
        public string full { get; set; }
        public int w { get; set; }
        public int h { get; set; }
    }

    public class Obj
    {
        public string version { get; set; }
        public string id { get; set; }
        public string name { get; set; }
        public string title { get; set; }
        public Info info { get; set; }
        public Image image { get; set; }
        public List<string> tags { get; set; }
    }

    public class Data
    {
        public List<Obj> obj { get; set; }
    }

    public class Result
    {
        public string version { get; set; }
        public Data data { get; set; }
    }
0
user2712158 3 Май 2021 в 20:40