2016-10-20 4 views
1
var data1 = new[] { 
       new { Product = "Product 1", Year = 2009, Sales = 1212 }, 
       new { Product = "Product 2", Year = 2009, Sales = 522 }, 
       new { Product = "Product 1", Year = 2010, Sales = 1337 }, 
       new { Product = "Product 2", Year = 2011, Sales = 711 }, 
       new { Product = "Product 2", Year = 2012, Sales = 2245 }, 
       new { Product = "Product 3", Year = 2012, Sales = 1000 } 
      }; 
      string jsondata =JsonConvert.SerializeObject(data1); 

То, что я хочу сделать, это Deserialize jsondata на тот же объект, как и в data1 (C# массив анонимного типа {строки продукта, внутр Год, внутр Sales})Deserialize JSON строку в C# анонимный массив

Я попытался без успеха ..

var dataj = JsonConvert.DeserializeObject<JArray>(jsondata); 
      var data = dataj.ToArray(); 

Как я знаю .. Потому что следующий не работает, хотя он работает с оригинальным C# массив (data1)

foreach (var d in data) 
      { 
       int a = d.Year; 
      } 

без создания отдельного класса, я могу это сделать ..

ответ

1

Есть трюк, howto десериализует его без динамики. Это должно быть быстрее. Это также может быть как общее решение

public static class Ext 
{ 
    public static IEnumerable<T> Deserialize<T>(this string source, T typeHolder) 
    { 
     var ltype = typeof(List<>); 
     var constructed = ltype.MakeGenericType(new[] { typeHolder.GetType() }); 

     // deserializing 
     return (JsonConvert.DeserializeObject(source, constructed) as IList).Cast(typeHolder); 
    } 

    public static IEnumerable<T> Cast<T>(this IEnumerable x, T typeHolder) 
    { 
     foreach (var item in x) 
     { 
      yield return (T)item; 
     } 
    } 
} 

Таким образом, использование:

void Main() 
{ 
    var data1 = new[] { 
         new { Product = "Product 1", Year = 2009, Sales = 1212 }, 
         new { Product = "Product 2", Year = 2009, Sales = 522 }, 
         new { Product = "Product 1", Year = 2010, Sales = 1337 }, 
         new { Product = "Product 2", Year = 2011, Sales = 711 }, 
         new { Product = "Product 2", Year = 2012, Sales = 2245 }, 
         new { Product = "Product 3", Year = 2012, Sales = 1000 } 
        }; 

    string jsondata = JsonConvert.SerializeObject(data1); 
    var ob = new { Product = "Product 1", Year = 2009, Sales = 1212 }; 
    var deserializedObject = jsondata.Deserialize(ob); 
} 
3

Вы должны использовать ключевое слово dynamic поскольку Year действительно не является свойством JToken. Взаимодействие во время выполнения может отбросить значение, хотя от интроспекции JToken.

Это единственная линия, которую Вы должны изменить:

dynamic data = dataj.ToArray(); 

В исходном коде типа является анонимным, но это вовсе не означает, что он не может знать, какие свойства он имеет.