2009-11-25 30 views
6

Json.NET kütüphanesi kullanıyorum. JSON'da C# ile seri hale getirme/serileştirme dizilerinin en uygun yolu nedir? ne zaman, o zamanJson.NET: serializing/deserializing dizileri

JObject o = JObject.Parse(File.ReadAllText("input.txt")) 

Ve: Ben bir değişkene dosyadan Yukarıdaki metni okuyorum

{ 
    "Name": "Christina", 
    "Gender": "female", 
    "Favorite_numbers": [11, 25 ,23] 
} 

: Örneğin, ben şu metni (Dosyadan okuma) serisini çalışıyorum 'bir hata almak

int[] num = (int[]) o["Favorite_numbers"] 

içeren bir dizi [11, 24, 23] ayıklamak için çalışıyorum.

Neyi yanlış yapıyorum? Bir diziyi doğru bir şekilde nasıl okurum? Aşağıdaki türde [[1, 2, 3], [4, 5, 6]]'un 2 boyutlu dizilerini doğru olarak nasıl okuyabilirim?

+1

hatası nedir ? –

cevap

2

Favorite_numbers özelliği, JArray türünde olacak, çünkü ne tür bir sonuç olması gerektiğine dair bir yolu yoktur. Bu nesnenin seri hale getirilmesinin en uygun yolu, bunun için bir C# sınıfı tanımlamak ve JSON'u tanımlanmış sınıfınıza serpmek için JsonConvert.DeserializeObject<T>(...) yöntemini kullanacaktır.

1

Yaptığınıza bağlı olarak değişir. Durumunuzda en kolay yolu, bir JsonConverter oluşturmak olacaktır. Yapabileceğin Yani şu:

public class IntArrayConverter : JsonCreationConverter<int[]> 
{ 

    protected override int[] Create(Type objectType, JArray jArray) 
    { 
     List<int> tags = new List<int>(); 

     foreach (var id in jArray) 
     { 
      tags.Add(id.Value<int>()); 
     } 

     return tags.ToArray(); 
    } 
} 

public abstract class JsonCreationConverter<T> : JsonConverter 
{ 
    /// <summary> 
    /// Create an instance of objectType, based properties in the JSON Array 
    /// </summary> 
    /// <param name="objectType">type of object expected</param> 
    /// <param name="jObject">contents of JSON Array that will be deserialized</param> 
    /// <returns></returns> 
    protected abstract T Create(Type objectType, JArray jObject); 

    public override bool CanConvert(Type objectType) 
    { 
     return typeof(T).IsAssignableFrom(objectType); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     JArray jArray = JArray.Load(reader); 

     T target = Create(objectType, jArray); 

     return target; 
    } 

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

Sonra yeni özniteliği ile modelinizi tanımlayın:

public class Person 
{ 
    public string Name { get; set; } 
    public string Gender { get; set; } 
    [JsonConverter(typeof(IntArrayConverter))] 
    public int[] Favorite_numbers { get; set; } 
} 

Ve her zamanki gibi kullanabilirsiniz:

Person result = JsonConvert.DeserializeObject<Person>(@"{ 
       ""Name"": ""Christina"", 
       ""Gender"": ""female"", 
       ""Favorite_numbers"": [11, 25 ,23] 
      }");