2017-03-17 11 views
0

私はいくつかの答えられた質問のコードを使用してカスタムJSONコンバータを作成しようとしています。JSON配列またはJSONオブジェクトをオブジェクトのリストに変換するにはどうすればよいですか?

public class SingleValueArrayConverter<T> : JsonConverter 
{ 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     if (reader.TokenType == JsonToken.StartObject) 
     {     
      T instance = serializer.Deserialize<T>(reader); 
      return new List<T>() { instance }; 
     } 
     else if (reader.TokenType == JsonToken.StartArray) 
     { 
      return serializer.Deserialize<List<T>>(reader); 
     } 

     return null; 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return true; 
    } 

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

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

これは私のサンプルモデルクラスです。

public class Foo 
{ 
    [JsonProperty("type")] 
    public string Type; 
} 

私は次のコードを使用して実行します。スタックオーバーフローに関するエラーが発生します。

var converter = new SingleValueArrayConverter<Foo>(); 

var test1 = "[{ \"type\": \"test\" }]"; 
var result1 = JsonConvert.DeserializeObject<List<Foo>>(test1, converter); 

var test2 = "{ \"type\": \"test\" }"; 
var result2 = JsonConvert.DeserializeObject<List<Foo>>(test2, converter); 

enter image description here

+1

次のトークンでは読んでいますが、読んでいないのでストリームから削除しています。カスタムの読み取り/書き込みメソッドの中では、* reader *自体を使用する必要があります。 readメソッドがどのように動作するかの例については、[この回答](http://stackoverflow.com/a/8031283/563532)を参照してください。 – Rob

答えて

0

.NETオブジェクトに任意のJSONに変換する最も簡単な方法は、"ToObject" JTokenオブジェクトの方法を使用しています。

public class FooConverter : JsonConverter 
{ 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var token = JToken.Load(reader); 

     if (token.Type == JTokenType.Array) 
     { 
      return token.ToObject<List<Foo>>(); 
     } 

     var item = token.ToObject<Foo>(); 

     return new List<Foo> { item }; 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return true; 
    } 

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

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

PS。 JTokenオブジェクトはJSONデータの基本クラスなので、JTokenオブジェクトを任意の適切な型に変換できます。

JToken    - abstract base class  
    JContainer  - abstract base class of JTokens that can contain other JTokens 
     JArray  - represents an JSON array (contains an ordered list of JTokens) 
     JObject  - represents an JSON object (contains a collection of JProperties) 
     JProperty - represents a JSON property (a name/JToken pair inside a JObject) 
    JValue   - represents a primitive JSON value (string, number, boolean, null) 
関連する問題