【问题标题】:Binding JSON values in my server side is getting failed在我的服务器端绑定 JSON 值失败
【发布时间】:2018-11-30 08:54:09
【问题描述】:

我想在我的 c# 代码中使用 json 值。所以我写了如下代码

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; }
}

【问题讨论】:

  • 您的架构属性之一被定义为一个集合,但它只获得一个值因此失败
  • @JohnB:哪一个。 ?
  • 这可能有助于查看目标类被反序列化为..

标签: c# asp.net json list


【解决方案1】:

更新: Panagiotis Kanavos 声明,您没有创建 Root 对象,因此您必须重新构建模型。

不知道你的模型是什么样的,但是这个错误信息说你给了它期望 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);
}

【讨论】:

  • 我无法再次创建 SiteData 类。我已经上课MasterServiceResponse
  • 好的,那你能把你现有的模型贴在这里吗?所以我们可以找出问题所在?
  • 我已经更新了我的问题,看看..如果你还需要什么..让我知道
  • @BNN 你还没有创建了一个根类。 JSON 文件包含一个 object,其 SiteData 属性包含多个 MasterServiceResponse 对象
  • 是的,问题是“SiteData”是一个包含对象数组的对象,List 需要一个对象数组,因此您必须相应地更新模型
【解决方案2】:

正如错误所述,您无法将 JSON 对象反序列化以列出。所以而不是:

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

你应该更新有类似的东西:

MyObject obj = JsonConvert.DeserializeObject<MyObject>(jsonValue);

【讨论】:

    【解决方案3】:

    异常消息告诉您 JSON 字符串包含单个对象,但您尝试将其反序列化为 List&lt;MasterServiceResponse&gt; 集合。

    你应该创建一个类来保存List&lt;MasterServiceResponse&gt;

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

    那么你应该替换这一行:

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

    像这样返回单个对象:

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

    参考:

    Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1

    【讨论】:

    • 如果我使用它,我将无法使用foreach (MasterServiceResponse record in records) { sw.WriteLine(record.SapId); } 并出现错误
    【解决方案4】:

    由于您的 JSON 以具有数组值的键 "SiteData" 开头,因此您需要创建一个帮助类来匹配该结构(例如 class SiteResponse)和一个名为 SiteData 类型为 List&lt;MasterServiceResponse&gt; 的属性。

    代码:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-02-22
      • 1970-01-01
      相关资源
      最近更新 更多