Привязка значений JSON на моей стороне сервера не удалась - PullRequest
0 голосов
/ 30 ноября 2018

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

public static void WriteToIEMService(string jsonValue)
    {
        string TimeFormatText = DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss");
        string strFileCreationDate = DateTime.Now.ToString("dd/MM/yyyy");
        string strFileName = ConfigurationManager.AppSettings["IEM_SERVICEFILE"].ToString();

        try
        {            
           using (StreamWriter sw = File.CreateText(ConfigurationManager.AppSettings["LogFileDirectory"].ToString() + strFileName + "_" + strFileCreationDate + ".txt"))
            {
                List<MasterServiceResponse> records = JsonConvert.DeserializeObject<List<MasterServiceResponse>>(jsonValue);

                sw.WriteLine("IEM Service started and send data to IEM below");

                foreach (MasterServiceResponse record in records)
               {
                   sw.WriteLine(record.SapId);
               }
            }
        }
        catch (Exception)
        {

            throw;
        }
    }

Но я получаю сообщение об ошибке:

Невозможно десериализовать текущий объект JSON (например, {"name": "value"})в тип 'System.Collections.Generic.List`1 [IPColoBilling_BKP.App_Code.MasterServiceResponse]', поскольку для корректной десериализации тип требует массив JSON (например, [1,2,3]).

Пожалуйста, помогите

РЕДАКТИРОВАТЬ

Мои значения JSON, как показано ниже

{"SiteData":[{"SAPId":"I-UW-SRPR-ENB-I001","SiteRFEIDate":"03-11-2014","SiteRFSDate":"03-11-2014","ID_OD":"ID","ID_ODchangeDate":"04-11-2018","NoofRRHBase":"0","RRHBaseChangeEffectiveDate":"","No_Of_Tenancy":"3","TenancyChangeEffectiveDate":"03-11-2014","SiteStatus":"Active","SiteDropDate":""}]}

ОБНОВЛЕНИЕ

public class MasterServiceResponse
{
    public string SapId { get; set; }
    public string AcknowledgementID { get; set; }
    public string FlagResponse { get; set; }
    public string ResponseMessage { get; set; }
    public string GisStatus { get; set; }
    public string GisSendDate { get; set; }
    public string SiteRFEIDate { get; set; }
    public string SiteRFSDate { get; set; }
    public string SiteRRHDate { get; set; }
    public string NoofRRHBase { get; set; }
}

Ответы [ 4 ]

0 голосов
/ 30 ноября 2018

Поскольку ваш JSON начинается с ключа "SiteData", который имеет значение массива, вам нужно создать вспомогательный класс для соответствия этой структуре (например, class SiteResponse) со свойством с именем SiteData типа List<MasterServiceResponse>.

Код:

public class SiteResponse
{
    public List<MasterServiceResponse> SiteData { get; set; }
}

private static void TestJson()
{
    var jsonValue = "{\"SiteData\":[{\"SAPId\":\"I-UW-SRPR-ENB-I001\",\"SiteRFEIDate\":\"03-11-2014\",\"SiteRFSDate\":\"03-11-2014\",\"ID_OD\":\"ID\",\"ID_ODchangeDate\":\"04-11-2018\",\"NoofRRHBase\":\"0\",\"RRHBaseChangeEffectiveDate\":\"\",\"No_Of_Tenancy\":\"3\",\"TenancyChangeEffectiveDate\":\"03-11-2014\",\"SiteStatus\":\"Active\",\"SiteDropDate\":\"\"}]}";

    var siteResponse = JsonConvert.DeserializeObject<SiteResponse>(jsonValue);
    List<MasterServiceResponse> records = siteResponse.SiteData;
}

Рабочая демонстрация здесь:
https://dotnetfiddle.net/wzg8AK

0 голосов
/ 30 ноября 2018

Как упоминается в сообщении об ошибке, вы не можете десериализовать объект JSON в список.Поэтому вместо:

List<MasterServiceResponse> records = JsonConvert.DeserializeObject<List<MasterServiceResponse>>(jsonValue);

Вы должны обновить что-то вроде:

MyObject obj = JsonConvert.DeserializeObject<MyObject>(jsonValue);
0 голосов
/ 30 ноября 2018

Сообщение об исключении говорит вам, что строка JSON содержит один объект, но вы попытались десериализовать его в коллекцию List<MasterServiceResponse>.

Вы должны создать класс для хранения List<MasterServiceResponse>:

public class SiteData
{
    public List<MasterServiceResponse> MasterServiceResponse { get; set; }
}

Затем вы должны заменить эту строку:

List<MasterServiceResponse> records = JsonConvert.DeserializeObject<List<MasterServiceResponse>>(jsonValue);

, чтобы вернуть один объект, подобный этому:

SiteData records = JsonConvert.DeserializeObject<SiteData>(jsonValue);

Ссылка:

Невозможнодесериализовать текущий объект JSON (например, {"name": "value"}) в тип 'System.Collections.Generic.List`1

0 голосов
/ 30 ноября 2018

Обновление: Заявление Panagiotis Kanavos: вы не создаете корневой объект, поэтому вам нужно реструктурировать свои модели.

Не знаю, как выглядит ваша модель, но этов сообщении об ошибке говорится, что вы передаете объект json, где он ожидает массив JSON,

Ниже приведена модель, которую вы должны использовать

public class SiteData
{
    public string SAPId { get; set; }
    public string SiteRFEIDate { get; set; }
    public string SiteRFSDate { get; set; }
    public string ID_OD { get; set; }
    public string ID_ODchangeDate { get; set; }
    public string NoofRRHBase { get; set; }
    public string RRHBaseChangeEffectiveDate { get; set; }
    public string No_Of_Tenancy { get; set; }
    public string TenancyChangeEffectiveDate { get; set; }
    public string SiteStatus { get; set; }
    public string SiteDropDate { get; set; }
}

public class RootObject
{
    public List<SiteData> SiteData { get; set; }
}

Вы также должны изменить код десериализации

Например

RootObject records = JsonConvert.DeserializeObject<RootObject>(jsonValue);

foreach (SiteData record in records.SiteData)
{
   sw.WriteLine(record.SapId);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...