あなたの基本的な問題は、データコントラクトシリアライザ(両方DataContractSerializer
とDataContractJsonSerializer
)があるということですオプトイン。あなたはUsing Data Contractsで説明したように、あなたも、メンバーが[DataMember]
をシリアル化するマークする必要があります[DataContract]
とタイプマークした場合:
をまた明示的DataContractAttributeとDataMemberAttribute属性を使用してデータコントラクトを作成することができます。これは通常、型にDataContractAttribute属性を適用して行います。この属性は、クラス、構造体、および列挙型に適用できます。次に、DataMemberAttribute属性をデータコントラクトタイプの各メンバーに適用して、それがデータメンバーであることを示します。つまり、シリアル化する必要があります。
あなたのnewses
型のメンバのいずれかに[DataMember]
を適用していないので、そのメンバーがデシリアライズされていない場合はなし。
第二の問題は、あなたがint
としてwater_level_trend
宣言したということですが、それはJSONに空の文字列として表示されます:
空の文字列を整数にバインドすることはできません。試してみると、DataContractJsonSerializer
は次の例外をスローします:
タイプApiRegionalneのオブジェクトを逆シリアル化する際にエラーが発生しました。値 ''は 'Int32'型として解析できません。
明示的にデータコントラクト属性で、あなたが適用される目的の属性とあなたのためのあなたのタイプを自動生成するために、サイトhttps://jsonutils.com/を使用することができ、あなたのタイプをマークしたいように見えるので。また、推奨ネットスタイルに適合に続いもたらし、あなたの財産やタイプ名自動的にキャメルケースに選択することができます。このような自動生成型に手動でいくつかの修正を行うことが必要だった
[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; }
}
注意数値プロパティをいくつかの適切な非数値の名前に変更する1
~One
。さらに、JSONのnullだったいくつかのプロパティの型をobject
からstring
のようなより適切なものに変更する必要がありました。手動での変更は上にコメントされています。
出典
2017-09-19 17:44:41
dbc
また、Newtonsoft.Json JsonConvert.DeserializeObjectメソッドを使用して試すこともできます – Amit