C# 如何在c语言中反序列化json数组#

C# 如何在c语言中反序列化json数组#,c#,.net,json,C#,.net,Json,我正在尝试反序列化以下JSON文件: 我的c#代码: 我的班级: [DataContract] public class newses { public int id; public string title; public bool shortcut; public string content; public bool rso_alarm; public string rso_icon; public string longitude;

我正在尝试反序列化以下JSON文件:

我的c#代码:

我的班级:

[DataContract]
public class newses
{
    public int id;
    public string title;
    public bool shortcut;
    public string content;
    public bool rso_alarm;
    public string rso_icon;
    public string longitude;
    public string latitude;
    public int water_level_value;
    public int water_level_warning_status_value;
    public int water_level_alarm_status_value;
    public int water_level_trend;
    public string river_name;
    public string location_name;
    public string type;
}

[DataContract]
public class ApiRegionalne
{
    [DataMember(Name = "newses")]
    public newses[] newses;
}
JSON反序列化程序不会抛出任何异常,但我的数据仍然为null


我做错了什么?

您需要将类
新闻的所有公共字段标记为合同的一部分:

[DataContract]
public class newses
{
    [DataMember(Name = "id")] //This is what you need to add
    public int id;

    //Do the same for all other fields        
}

您的基本问题是数据协定序列化程序(包括
DataContractSerializer
DataContractJsonSerializer
)是选择加入的。如果使用
[DataContract]
标记类型,则还必须使用
[DataMember]
标记要序列化的成员,如中所述:

还可以使用和属性显式创建数据协定。这通常是通过将DataContractAttribute属性应用于类型来完成的。此属性可应用于类、结构和枚举。然后,必须将DataMemberAttribute属性应用于数据协定类型的每个成员,以指示它是数据成员,也就是说,应该序列化它

您尚未将
[DataMember]
应用于
新闻
类型的任何成员,因此,如果对其成员进行反序列化,则没有应用

第二个问题是,您已将
水位趋势声明为
int
,但它在JSON中显示为空字符串:

     "water_level_trend":"",
空字符串不能绑定到整数;如果尝试,
DataContractJsonSerializer
将引发以下异常:

反序列化APINE类型的对象时出错。无法将值“”分析为类型“Int32”

由于您似乎希望使用数据协定属性显式标记您的类型,因此您可以使用站点自动生成应用了所需属性的类型。您还可以选择自动对属性和类型名称进行大小写转换,从而使其符合推荐的.Net样式:

[DataContract]
public class Pagination
{
    [DataMember(Name = "totalitems")]
    public int Totalitems { get; set; }

    [DataMember(Name = "itemsperpage")]
    public int Itemsperpage { get; set; }
}

[DataContract]
public class Six // Fixed name from 6
{
    [DataMember(Name = "id")]
    public string Id { get; set; }

    [DataMember(Name = "name")]
    public string Name { get; set; }

    [DataMember(Name = "city")]
    public string City { get; set; }

    [DataMember(Name = "slug_name")]
    public string SlugName { get; set; }
}

[DataContract]
public class Provinces
{
    [DataMember(Name = "6")]
    public Six Six { get; set; }
}

[DataContract]
public class News
{
    [DataMember(Name = "id")]
    public string Id { get; set; }

    [DataMember(Name = "title")]
    public string Title { get; set; }

    [DataMember(Name = "shortcut")]
    public string Shortcut { get; set; }

    [DataMember(Name = "content")]
    public string Content { get; set; } // Fixed type from object

    [DataMember(Name = "rso_alarm")]
    public string RsoAlarm { get; set; }

    [DataMember(Name = "rso_icon")]
    public string RsoIcon { get; set; } // Fixed type from object

    [DataMember(Name = "valid_from")]
    public string ValidFrom { get; set; }

    [DataMember(Name = "0")]
    public string Zero { get; set; }  // Fixed name from 0

    [DataMember(Name = "valid_to")]
    public string ValidTo { get; set; }

    [DataMember(Name = "1")]
    public string One { get; set; } // Fixed name from 1

#if false
    // Removed since the correct type is unknown.
    [DataMember(Name = "repetition")]
    public object Repetition { get; set; }
#endif

    [DataMember(Name = "longitude")]
    public string Longitude { get; set; }

    [DataMember(Name = "latitude")]
    public string Latitude { get; set; }

    [DataMember(Name = "water_level_value")]
    public int WaterLevelValue { get; set; } // Fixed type to int

    [DataMember(Name = "water_level_warning_status_value")]
    public int WaterLevelWarningStatusValue { get; set; } // Fixed type to int

    [DataMember(Name = "water_level_alarm_status_value")]
    public int WaterLevelAlarmStatusValue { get; set; } // Fixed type to int

    [DataMember(Name = "water_level_trend")]
    public string WaterLevelTrend { get; set; } // This must remain a string since it appears as a non-numeric empty string in the JSON: "".

    [DataMember(Name = "river_name")]
    public string RiverName { get; set; }

    [DataMember(Name = "location_name")]
    public string LocationName { get; set; }

    [DataMember(Name = "created_at")]
    public string CreatedAt { get; set; }

    [DataMember(Name = "2")]
    public string Two { get; set; } // // Fixed name from 2

    [DataMember(Name = "updated_at")]
    public string UpdatedAt { get; set; }

    [DataMember(Name = "3")]
    public string Three { get; set; } // Fixed name from 3

    [DataMember(Name = "type")]
    public string Type { get; set; }

    [DataMember(Name = "provinces")]
    public Provinces Provinces { get; set; }
}

[DataContract]
public class ApiRegionalne
{
    [DataMember(Name = "pagination")]
    public Pagination Pagination { get; set; }

    [DataMember(Name = "newses")]
    public IList<News> Newses { get; set; }
}
[DataContract]
公共类分页
{
[DataMember(Name=“totalitems”)]
公共整数Totalitems{get;set;}
[DataMember(Name=“itemsperpage”)]
public int Itemsperpage{get;set;}
}
[数据合同]
公共类6//固定了6中的名称
{
[数据成员(Name=“id”)]
公共字符串Id{get;set;}
[数据成员(Name=“Name”)]
公共字符串名称{get;set;}
[DataMember(Name=“city”)]
公共字符串City{get;set;}
[DataMember(Name=“slug\u Name”)]
公共字符串名称{get;set;}
}
[数据合同]
公营省
{
[数据成员(Name=“6”)]
公共六六{get;set;}
}
[数据合同]
公共类新闻
{
[数据成员(Name=“id”)]
公共字符串Id{get;set;}
[DataMember(Name=“title”)]
公共字符串标题{get;set;}
[DataMember(Name=“快捷方式”)]
公共字符串快捷方式{get;set;}
[DataMember(Name=“content”)]
公共字符串内容{get;set;}//来自对象的固定类型
[DataMember(Name=“rso_报警”)]
公共字符串RsoAlarm{get;set;}
[数据成员(Name=“rso_图标”)]
公共字符串RsoIcon{get;set;}//已修复对象的类型
[DataMember(Name=“valid_from”)]
来自{get;set;}的公共字符串有效
[DataMember(Name=“0”)]
公共字符串零{get;set;}//已从0修复名称
[DataMember(Name=“valid_to”)]
有效的公共字符串{get;set;}
[数据成员(Name=“1”)]
公共字符串一{get;set;}//固定了来自1的名称
#如果错误
//已删除,因为正确的类型未知。
[数据成员(Name=“repeation”)]
公共对象重复{get;set;}
#恩迪夫
[DataMember(Name=“经度”)]
公共字符串经度{get;set;}
[DataMember(Name=“latitude”)]
公共字符串纬度{get;set;}
[DataMember(Name=“水位值”)]
public int-WaterLevelValue{get;set;}//将类型固定为int
[DataMember(Name=“水位警告状态值”)]
public int-WaterLevelWarningStatusValue{get;set;}//已将类型固定为int
[DataMember(Name=“水位报警状态值”)]
public int WaterLevelAlarmStatusValue{get;set;}//已将类型固定为int
[DataMember(Name=“水位趋势”)]
公共字符串WaterLevelTrend{get;set;}//此字符串必须保持为字符串,因为它在JSON中显示为非数字的空字符串:“”。
[DataMember(Name=“river_Name”)]
公共字符串RiverName{get;set;}
[DataMember(Name=“location\u Name”)]
公共字符串位置名称{get;set;}
[DataMember(Name=“created_at”)]
公共字符串CreatedAt{get;set;}
[数据成员(Name=“2”)]
公共字符串二{get;set;}///来自2的固定名称
[DataMember(Name=“updated_at”)]
公共字符串UpdatedAt{get;set;}
[数据成员(Name=“3”)]
公共字符串三{get;set;}//固定了来自3的名称
[DataMember(Name=“type”)]
公共字符串类型{get;set;}
[数据成员(Name=“省”)]
公共省{get;set;}
}
[数据合同]
公共级芹菜碱
{
[DataMember(Name=“分页”)]
公共分页分页{get;set;}
[DataMember(Name=“newses”)]
公共IList新闻{get;set;}
}

注意:有必要对自动生成的类型进行一些手动修复,例如将数值属性重命名为一些适当的非数值名称,例如
1
One
。此外,有必要将JSON中的一些空属性的类型从
object
更改为更合适的类型,例如
string
。上面对手动更改进行了注释。

或者,您可以尝试使用Newtonsoft.Json JsonConvert.DeserializeObject方法
[DataContract]
public class Pagination
{
    [DataMember(Name = "totalitems")]
    public int Totalitems { get; set; }

    [DataMember(Name = "itemsperpage")]
    public int Itemsperpage { get; set; }
}

[DataContract]
public class Six // Fixed name from 6
{
    [DataMember(Name = "id")]
    public string Id { get; set; }

    [DataMember(Name = "name")]
    public string Name { get; set; }

    [DataMember(Name = "city")]
    public string City { get; set; }

    [DataMember(Name = "slug_name")]
    public string SlugName { get; set; }
}

[DataContract]
public class Provinces
{
    [DataMember(Name = "6")]
    public Six Six { get; set; }
}

[DataContract]
public class News
{
    [DataMember(Name = "id")]
    public string Id { get; set; }

    [DataMember(Name = "title")]
    public string Title { get; set; }

    [DataMember(Name = "shortcut")]
    public string Shortcut { get; set; }

    [DataMember(Name = "content")]
    public string Content { get; set; } // Fixed type from object

    [DataMember(Name = "rso_alarm")]
    public string RsoAlarm { get; set; }

    [DataMember(Name = "rso_icon")]
    public string RsoIcon { get; set; } // Fixed type from object

    [DataMember(Name = "valid_from")]
    public string ValidFrom { get; set; }

    [DataMember(Name = "0")]
    public string Zero { get; set; }  // Fixed name from 0

    [DataMember(Name = "valid_to")]
    public string ValidTo { get; set; }

    [DataMember(Name = "1")]
    public string One { get; set; } // Fixed name from 1

#if false
    // Removed since the correct type is unknown.
    [DataMember(Name = "repetition")]
    public object Repetition { get; set; }
#endif

    [DataMember(Name = "longitude")]
    public string Longitude { get; set; }

    [DataMember(Name = "latitude")]
    public string Latitude { get; set; }

    [DataMember(Name = "water_level_value")]
    public int WaterLevelValue { get; set; } // Fixed type to int

    [DataMember(Name = "water_level_warning_status_value")]
    public int WaterLevelWarningStatusValue { get; set; } // Fixed type to int

    [DataMember(Name = "water_level_alarm_status_value")]
    public int WaterLevelAlarmStatusValue { get; set; } // Fixed type to int

    [DataMember(Name = "water_level_trend")]
    public string WaterLevelTrend { get; set; } // This must remain a string since it appears as a non-numeric empty string in the JSON: "".

    [DataMember(Name = "river_name")]
    public string RiverName { get; set; }

    [DataMember(Name = "location_name")]
    public string LocationName { get; set; }

    [DataMember(Name = "created_at")]
    public string CreatedAt { get; set; }

    [DataMember(Name = "2")]
    public string Two { get; set; } // // Fixed name from 2

    [DataMember(Name = "updated_at")]
    public string UpdatedAt { get; set; }

    [DataMember(Name = "3")]
    public string Three { get; set; } // Fixed name from 3

    [DataMember(Name = "type")]
    public string Type { get; set; }

    [DataMember(Name = "provinces")]
    public Provinces Provinces { get; set; }
}

[DataContract]
public class ApiRegionalne
{
    [DataMember(Name = "pagination")]
    public Pagination Pagination { get; set; }

    [DataMember(Name = "newses")]
    public IList<News> Newses { get; set; }
}