0

Столкнулся с такой проблемой. Требовалось вывести на datagridview список всех заявок (из json) вывел я их с помощью Newthonjson. создал список и передал его как ресурс для datagridview. проблема в том что ответ состоит из объекта в котором есть другой объект выглядит примерно так:

[
{
    "orderedBy": {
        "name": "Имя заказчика",
        "_id": "60a61e6656403833a40f73ee"
    },
    "takenBy": {
        "name": "Имя принявшего заказ",
        "_id": "60a7b663288d253d401592b0"
    },
    "takenAt": "2021-05-21",
    "_id": "60a7b24e1f32040990c37572",
    "status": "in progress",
    "description": "test order",
    "ordered_At": "2021-05-21",
    "__v": 0
},
{
    "orderedBy": {
        "name": "Имя",
        "_id": "60a61e6656403833a40f73ee"
    },
    "takenAt": null,
    "_id": "60a7b2892d3d3c2c500abaf0",
    "description": "test order",
    "status": "created",
    "ordered_At": "2021-05-21",
    "__v": 0
},
{
    "orderedBy": {
        "name": "Имя",
        "_id": "60a61e6656403833a40f73ee"
    },
    "takenAt": null,
    "_id": "60a7b28e2d3d3c2c500abaf1",
    "description": "test order2",
    "status": "created",
    "ordered_At": "2021-05-21",
    "__v": 0
},
{
    "orderedBy": {
        "name": "Имя",
        "_id": "60a61e6656403833a40f73ee"
    },
    "takenBy": {
        "name": "Имя",
        "_id": "60a7b663288d253d401592b0"
    },
    "takenAt": "2021-05-21",
    "_id": "60a7b2922d3d3c2c500abaf2",
    "description": "test order3",
    "status": "done",
    "ordered_At": "2021-05-21T13:16:02.411Z",
    "__v": 0
},
{
    "orderedBy": {
        "name": "Имя",
        "_id": "60a61e6656403833a40f73ee"
    },
    "takenAt": null,
    "_id": "60a88ffbc9b24a0015db80ef",
    "description": "this is description of order",
    "status": "created",
    "ordered_At": "2021-05-22",
    "__v": 0
}

]

Заполняю datagrid таким способом:

private void FillDatagrvw(string json)
    {
        dynamic job= new List<OrderResponse>();
    try
    {
        job = JsonConvert.DeserializeObject&lt;List&lt;OrderResponse&gt;&gt;(json);

    }
    catch (Exception ext){
        MessageBox.Show(ext.ToString());
    }
    if (job != null)
    {

        dataGridView1.AutoGenerateColumns = true;
        dataGridView1.DataSource = job;
        dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
    }
}

Поля класса OrderResponse:

public class OrderResponse { 
    public OrderBy orderedBy { get; set; }
    public TakenBy takenBy { get; set; }
    public string ordered_At { get; set; }
    public string takenAt { get; set; }
    public string status { get; set; }
    public string _id { get; set; }
    public string description { get; set; }
}

Помогите получить значения orderedBy и takenBy. Заранее спасибо

Jamaka
  • 13
  • 2
  • 1
    При чем тут Java? Где вы увидели "массив в массиве"? Массив, это [ ... ], у вас он один. Далее, почему dynamic job=? Почему OrderBy и TakenBy это отдельные классы, если свойства у них одинаковые? Да и вообще, в чем проблемы? У вас должно все работать. – EvgeniyZ May 23 '21 at 18:00
  • Ерундой не страдайте, вы уже сделали класс, в который все десериализуется, зачем вам "динамика"? Уберите dynamic и используйте класс как положено (item.OrderBy.Name)! (ответ на удалившийся коммент...) – EvgeniyZ May 23 '21 at 18:09
  • Можете подробно описать ваш ответ? – Jamaka May 23 '21 at 18:11
  • А что тут отвечать то? Вы не знаете как обращаться к свойствам класса или что? Я просто не понимаю вашу проблему, в чем трудности написать item.OrderBy.Name? – EvgeniyZ May 23 '21 at 18:13
  • Я передаю список в datagridview в котором значении этих полей отсутствуют – Jamaka May 23 '21 at 18:15
  • И что вы там увидеть собираетесь? – EvgeniyZ May 23 '21 at 18:16
  • вместо этого выводится текст orderedBy и takenBy я понимаю что значения я могу получить orderedBy.name т.д но мне нужно все в один список отправить – Jamaka May 23 '21 at 18:17
  • Я понял о чем вы. я хотел узнать возможность сразу передать список не расписывая значения поля по одному – Jamaka May 23 '21 at 18:19
  • Тогда наверно надо делать акцент не на JSON и сериализации/десериализации, а на вывод свойств класса в datagridview, не думаете так? Зачем вот нам, людям, которые совершенно не знают вас и ваш проект знать что либо про JSON, про то что "на JAVA я мог...", про то что "объект в объекте", вот смысл этого, если вам надо лишь кастомную колонку? – EvgeniyZ May 23 '21 at 18:21
  • Самое банальное решение, которое вы можете сделать - переопределить ToString (public override string ToString() => Name;) у TakenBy и OrderBy (это один объект, сделайте один класс, назовите его не знаю, By и используйте его), автогенерация должна будет вывести все как надо. Другим решением скорей всего будет отказ от автогенерации и созданием колонок самостоятельно. – EvgeniyZ May 23 '21 at 18:23
  • Благодарю за ответ. Буду пробовать – Jamaka May 23 '21 at 18:24
  • Ваше решение мне подошло все сделал как подсказали в последнем комментарии. Очень благодарен – Jamaka May 23 '21 at 18:42
  • Метод ToString предназначен для разработчика (для отладки). Если у вас всё работает, то можете оставить способ с его переопределением, но по гайдам, для вывода информации конечному пользователю, лучше его не использовать. | См. Customize Data Formatting – Alexander Petrov May 23 '21 at 19:02

1 Answers1

0
public class OrderResponse
{
    public OrderBy orderedBy { get; set; }
    public string OrderBy_name => orderedBy.name;
    public string OrderBy_id => orderedBy._id;
    public TakenBy takenBy { get; set; }
    public string takenBy_name => takenBy.name;
    public string takenBy_id => takenBy._id;
    public string ordered_At { get; set; }
    public string takenAt { get; set; }
    public string status { get; set; }
    public string _id { get; set; }
    public string description { get; set; }
}
Blackmeser
  • 2,033