Сериализация вложенного json C#

Приносим большие извинения за длинный пост. Мне нужно создать приведенный ниже формат json для публикации, чтобы отдохнуть api в C#. Приведенный ниже вызов работает, и я успешно использовал его в Postman, чтобы добавить его в целевую систему.

{
"item": {
    "attrs": {
        "attr": [{
                "name": "IP_Category",
                "value": "Miscellaneous"
            }, {
                "name": "Description",
                "value": "Picture of Rabbit"
            }, {
                "name": "Title",
                "value": "A Rabbit"
            }
        ]
    },
    "resrs": {
        "res": [{
                "filename": "Rabbit.jpg",
                "base64": "/9j/4AAQSkZJR"
            }
        ]
    },
    "acl": {
        "name": "Submitter"
        },
       "entityName": "IP_Document"
    }
}

На основании проведенного мной исследования мне нужно скопировать и «вставить специальный» в новый файл класса в Visual Studio, чтобы он мог создавать объекты класса на основе формата json (довольно круто!). И вот что он создает:

namespace BasicWebApp
{

public class Rootobject
{
    public Item item { get; set; }
}

public class Item
{
    public Attrs attrs { get; set; }
    public Resrs resrs { get; set; }
    public Acl acl { get; set; }
    public string entityName { get; set; }
}

public class Attrs
{
    public Attr[] attr { get; set; }
}

public class Attr
{
    public string name { get; set; }
    public string value { get; set; }
}

public class Resrs
{
    public Re[] res { get; set; }
}

public class Re
{
    public string filename { get; set; }
    public string base64 { get; set; }
}

public class Acl
{
    public string name { get; set; }
}
}

Проблема 1. Почему vs переименовывает объект res json в класс Re? Это зарезервированное слово в C#?

Проблема 2: я знаю, что мне нужно вкладывать вещи таким образом, но я на два уровня глубоко и не уверен, что кодировать?

var model = new Rootobject();
model.item = new Item
{
    attrs = new Attrs
    {
        attr = new List<Attr>
            {
                 **now what??**
            }
    }
}
res не является зарезервированным словом, однако ваш конвертер Json в C# (в данном случае Visual Studio) считает, что res является множественным числом для re.
TheGeneral 12.11.2018 07:05

Что касается вашего вопроса «res JSON object to class Re», Visual Studio посчитала «Re» единственной формой «Res». Точно так же вы можете проверить то же самое с Attr и Attrs.

Diwa 12.11.2018 07:06

А для вашей проблемы 2 я лично посоветовал бы использовать сторонние библиотеки, такие как Newtonsoft, что упростит задачу.

Diwa 12.11.2018 07:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
187
3

Ответы 3

Еще нет ответа на свой первый вопрос (но ищу его):

Что касается вашего второго вопроса, в части что теперь вы просто делаете:

new Attr(){ name = "name1", value = "value1" },
new Attr(){ name = "name1", value = "value2" }

Но я не это советую. Я советую вам подготовить свою коллекцию Attr, а затем назначить ее. Нравиться:

var model = new Rootobject();
model.item = new Item
{
    attrs = yourAttrCollection
}

Это касается и всего остального, что вы делаете. Подготовьте свои вещи, а затем назначьте их. Это увеличивает удобочитаемость вложенных объектов.

Problem 1: Why is vs renaming the res json object to to class Re? Is it a reserved word in c#?

Нет Re не является зарезервированным словом в классе. Как упомянул Генерал

res is plural for re's

Вы можете использовать атрибут JsonProperty для решения этой проблемы, например

public class Resrs
{
    [JsonProperty("res")]
    public Re[] res { get; set; }
}

Problem 2: I know I have to nest things in this fashion but I two levels deep and not sure what to code?

var model = new Rootobject();
model.item = new Item
{
    attrs = new Attrs
    {
        attr = new List<Attr>
            {
                 new Attr { name = "abc", value = "ABC" },
                 new Attr { name = "pqr", value = "PQR" }
            }
    }
}

Я использовал приведенный ниже код для создания необходимой мне структуры json. Спасибо всем, кто ответил:

Al Wol 15.11.2018 16:34

Спасибо всем, что откликнулись. Это помогло. В итоге я использовал приведенный ниже код для создания нужного мне объекта json.

var model = new RootObject();
            model.item = new Item
            {
                attrs = new Attrs
                {
                    attr = new List<Attr>
                {
                    new Attr { name = "IP_Category", value = ddlContent.Text },
                    new Attr { name = "Description", value = txtDesc.Text },
                    new Attr { name = "Title", value = txtTitle.Text }
                }
                },
                resrs = new Resrs
                {
                    res = new List<Re>
                {
                    new Re { filename = fName, base64 = base64string},
                }
                },
                acl = new Acl
                {
                    name = "Submitter"
                },
                entityName = "IP_Document"
            };

Другие вопросы по теме