2017-08-30 9 views
0

をデシリアライズするとき、単一およびアレイの両方可能性がハンドル:ここC#の私は逆シリアル化する必要があり、このようなXML持つXMLは、

<?xml version="1.0" encoding="utf-8" ?> 
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Countries> 
     <Country> 
     <CountryCode>CN</CountryCode> 
     <CurrentStatus>Active</CurrentStatus> 
     </Country> 
    </Countries> 

    <Countries> 
     <Country> 
     <CountryCode>AU</CountryCode> 
     <CurrentStatus>Cancelled</CurrentStatus> 
     </Country> 
     <Country> 
     <CountryCode>CN</CountryCode> 
     <CurrentStatus>Cancelled</CurrentStatus> 
     </Country> 
     <Country> 
     <CountryCode>US</CountryCode> 
     <CurrentStatus>Active</CurrentStatus> 
     </Country> 
    </Countries> 

    <Countries xsi:nil="true" /> 
</Root> 

を私の問題は、国がシングルとして国を持つことができるということで、あなたが見ることができます。それを稼働させるために今はobjectタイプとしていますが、扱いにくいです。これを解決する最良の解決策は何ですか?私は他のすべてのシステムがそれを使用しているので、これをjsonに変換しています。これが私たちが持っているXMLファイルです。

public class Country 
{ 

    [JsonProperty("CountryCode")] 
    public string CountryCode { get; set; } 

    [JsonProperty("CurrentStatus")] 
    public string CurrentStatus { get; set; } 
} 

public class CountryInfo 
{ 
    [JsonProperty("Country")] 
    public object Country { get; set; } 

    //Does not work 
    //[JsonProperty("Country")] 
    //public IList<Country> Country { get; set; } 
} 

public class Root 
{ 
    [JsonProperty("Countries")] 
    public IList<CountryInfo> Countries { get; set; } 
} 

public class ExampleCountry 
{ 
    [JsonProperty("Root")] 
    public Root Root { get; set; } 
} 

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(xml); 
string json = JsonConvert.SerializeXmlNode(xmlDoc); 
var exampleCountries = JsonConvert.DeserializeObject<ExampleCountry>(json); 

アップデート:私はpublic IList<Country> Country { get; set; }を有効にした場合

私は次のエラーを取得する:

Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.IList`1[]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.

+0

ので、それはありませんあなたのar要素が含まれていない場合、または要素が1つのみの場合は、配列にすることはできません。 –

+0

どうして 'public IList 国{get;セット; } 'うまくいきませんか?それはどのくらい正確に機能しませんか? –

+0

@AshleyPillay私は、彼が単一のオブジェクト(つまり、public Country Country {get; set;})を受け取ることができたときと同じように動作するとは限らないことを想定しています。 。 – hsoesanto

答えて

1

この回答を使用して、それを解決:

https://stackoverflow.com/a/18997172/3850405

public class CountryInfo 
{ 
    [JsonProperty("Country")] 
    [JsonConverter(typeof(SingleOrArrayConverter<Country>))] 
    public IList<Country> Country { get; set; } 
} 

public class SingleOrArrayConverter<T> : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return (objectType == typeof(List<T>)); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     JToken token = JToken.Load(reader); 
     if (token.Type == JTokenType.Array) 
     { 
      return token.ToObject<List<T>>(); 
     } 
     return new List<T> { token.ToObject<T>() }; 
    } 

    public override bool CanWrite 
    { 
     get { return false; } 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+1

あなたはそれに私を打ち負かす...私はちょうど最近見たようにその正確な記事を参照していた – hsoesanto

関連する問題