2017-04-03 4 views
1

I持っている単一INTとして返すことがINTの結果を持っているいくつかのJSON、またはINTの...すなわちのLIST:Newstonsoft.JsonデシリアライズINT <>

「のErrorCode」 :[3]

または

"のErrorCodeを":1

は、どのように私はそれがNewstonsoft.JsonのJsonConvertをデシリアライズするのですか?

オブジェクトをLISTとして定義すると、結果が単一のINTの場合は失敗し、逆の場合も同じ結果になります。

+0

は、すなわち(オブジェクトにのErrorCode値をデシリアライズしてみて、その結果を検査のErrorCodeを作ります。 propertyは 'object'型のプロパティです)。 –

答えて

2

jsonのデータタイプを解決する必要があると思います。たぶん常にINTを返すように配列を返すようにしてください。だから、あなたのJSONは次のようになります。

"ErrorCode":[3] 

その後、任意の単一のエラーコードはちょうどあなたが好きなクラスを作成することができますサイズ1

+1

残念ながら、私はWebサービスの結果をあまり支配していません。だから私はそれを変更することはできません。 –

+0

当分の間、私はオブジェクトのErrorCodeを省略しました...情報が私の使用上重要ではないので...それは機能します。 –

0

の配列のようになります。

class MyResult { 
    public object ErrorCode {get; set;} 
} 

と使用あなたのjsonを逆シリアル化する:

MyResult r = JsonConvert.Deserialize<MyResult>(json); 
List<int> errorCodes; 
if (r.ErrorCode is JArray) { 
    errorCodes = (r.ErrorCode as JArray).ToObject<List<int>>(); 
    // ... 
} else { 
    errorCodes = new List<int> { Convert.ToInt32(r.ErrorCode) }; 
    // ... 
} 

希望します。

0

カスタムJSONコンバーターを作成することができます:あなたはあなたのJSONをデシリアライズすることができます

class ResolveListConverter<T> : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     List<T> list = new List<T>(); 
     if (reader.TokenType == JsonToken.StartArray) 
     { 
      reader.Read(); 
      while (reader.Value != null) 
      { 
       list.Add(Converter(reader.Value)); 
       reader.Read(); 
      } 
     } 
     else if(reader.Value != null) 
     { 
      list.Add(Converter(reader.Value)); 
     } 
     return list; 
    } 

    public T Converter(object obj) => (T)Convert.ChangeType(obj, typeof(T)); 

    public override bool CanConvert(Type objectType) => true; 
} 

を:

var result = JsonConvert.DeserializeObject<List<int>>(json, new ResolveListConverter<int>()); 
関連する問題