2017-09-19 12 views
2

http://komunikaty.tvp.pl/komunikatyxml/malopolskie/wszystkie/0?_format=jsonC#でJSON配列をデシリアライズする方法私は、次のJSONファイルをデシリアライズしようとしています

私のC#コード:

MemoryStream stream1 = new MemoryStream(); 
StreamWriter writer = new StreamWriter(stream1); 
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(ApiRegionalne)); 
writer.Write(json); 
writer.Flush(); 
stream1.Position = 0; 
dane = (ApiRegionalne)ser.ReadObject(stream1); 

そして、私のクラス:

[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です。

私は間違っていますか?

+1

また、Newtonsoft.Json JsonConvert.DeserializeObjectメソッドを使用して試すこともできます – Amit

答えて

2

あなたの基本的な問題は、データコントラクトシリアライザ(両方DataContractSerializerDataContractJsonSerializer)があるということですオプトイン。あなたはUsing Data Contractsで説明したように、あなたも、メンバーが[DataMember]をシリアル化するマークする必要があります[DataContract]とタイプマークした場合:

をまた明示的DataContractAttributeDataMemberAttribute属性を使用してデータコントラクトを作成することができます。これは通常、型に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のようなより適切なものに変更する必要がありました。手動での変更は上にコメントされています。

2

あなたは契約の一部としてクラスnewsesの公開すべてのフィールドをマークする必要があります。

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

    //Do the same for all other fields   
} 
関連する問題