awaisshabir Ответов: 3

Как преобразовать объект класса в массив json в C#?


я вызываю web api через winform, когда передаю данные классу и вызываю функцию, которая показывает мне ошибку.


Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'Properties.Model.Tenant.TenantListItem[]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.


Что я уже пробовал:

[DataContract]
    public class TenantFilter
    {
        [DataMember]
        public string TenantName { get; set; }
        [DataMember]
        public long AreaID { get; set; }
    }

// my web api code 

 public async Task<list><tenantlistitem>> GetAllTenant(TenantFilter filter)
        {
            var result = new List<tenantlistitem>();
            try
            {
                var response = await TenantCore.LoadTenantGrid(filter);
                if (response != null)
                {
                    result = (List<tenantlistitem>)response;

                }
            }
            catch (System.Exception ex)
            {


            }
            return result;
        }
// calling through winform
private async Task<ienumerable><tenantlistitem>> PopulateTenantGridView()
        {
            var result = new List<tenantlistitem>();
            try
            {
                using (var client = new HttpClient())
                {
                    var name = txtName.Text;
                    var area = (cmbArea.SelectedValue == null ? 0 : (long)cmbArea.SelectedValue);

                    var tenantfilter = new TenantFilter
                    {
                        TenantName = name,
                        AreaID = area
                    };

                    var serializedProduct = JsonConvert.SerializeObject(tenantfilter,Formatting.Indented);
                    var content = new StringContent(serializedProduct, Encoding.UTF8, "application/json");
                    var response = await client.PostAsync("http://localhost:64456/api/Tenant/GetAllTenant/", content);

                    if (response.IsSuccessStatusCode)
                    {
                        var Jsonstring = await response.Content.ReadAsStringAsync();
                        var tenant = JsonConvert.DeserializeObject<tenantlistitem[]>(Jsonstring).ToList();
                        if (tenant != null)
                        {

                             result = tenant.Take(100).ToList();
                        }
                    }
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

            }
            return result;
        }

3 Ответов

Рейтинг:
2

Afzaal Ahmad Zeeshan

Это потому, что ваш JSON может быть только таким,

{ /* document data here. */ }

Но код, который вы выполняете, требует, чтобы ваш документ JSON содержал массив объектов, который начинается с [ и кончается тем, что ] Это ошибка, с которой вы сталкиваетесь. Обновите документ JSON на сервере, чтобы ваш клиентский код работал. Если это не сработает, то вам придется справиться с проблемой самостоятельно, используя try...catch блок.

Прочтите следующие статьи, которые я написал, и кучу моих предыдущих ответов, которые помогут вам еще больше понять эту концепцию:

От нуля до героя в JSON с C#[^]
http://www.codeproject.com/Answers/1109587/How-to-deserialize-my-json-data-to-relevent-object#answer1[^]
http://www.codeproject.com/Answers/836988/how-to-remove-duplicate-records-in-a-json-file#answer2[^]
http://www.codeproject.com/Answers/879055/How-do-I-get-Ajax-to-read-my-json-string#answer1[^]
http://www.codeproject.com/Answers/828795/How-do-I-write-a-Csharp-program-to-read-json-data#answer2[^]


Рейтинг:
2

awaisshabir

в случае использования метода Get я использую Post в Web api, а затем исправил эту проблему.

ниже приведен мой код

[HttpPost]
[Маршрут ("PopulateTenantGrid")]

public async Task<list><tenantlistitem>> GetAllTenant(TenantFilter filter)
        {
            var result = new List<tenantlistitem>();
            try
            {
                var response = await TenantCore.LoadTenantGrid(filter);
                if (response != null)
                {
                    result = (List<tenantlistitem>)response;
 
                }
            }
            catch (System.Exception ex)
            {
 

            }
            return result;
        }


Рейтинг:
0

P_Z

var tenantfilter = new TenantFilter
                    {
                        TenantName = name,
                        AreaID = area
                    };

                   var serializedProduct = JsonConvert.SerializeObject(tenantfilter,Formatting.Indented); 

это сериализуется до 1 объекта {"name": "value"} Вы можете изменить код на:
var tenantfilter = new TenantFilter
                    {
                        TenantName = name,
                        AreaID = area
                    };

var tenantFilterList = new List<tenantfilter>();
tenantFilterList.Add(tenantFilter);

                   var serializedProduct = JsonConvert.SerializeObject(tenantfilterList,Formatting.Indented);

это сериализуется в массив, который содержит 1 объект [ {"name": "value"}] ... обратите внимание на разницу [ ], которая указывает на массив
если вы добавите больше объектов в список, то он будет сериализован, например [ {"name": "value"}, {"name": "value2"}, ... и т. д]