2015-04-09 3 views
0

У меня есть массив объектов, созданный из json. Каждое значение массива представляет собой массив из 2 вспомогательных массивов. первый имеет вид ["id", some integer] , а второй - ["name", "SomeName"].извлечение модели из массива объектов с использованием linq

Я хочу использовать LINQ для извлечения этих значений в массиве класса , который обладает этими двумя свойствами (то есть идентификатор и имя):

public class person 
{ 
    public int id; 
    public string name; 
} 

, так что результат будет иметь вид person[]. Как это сделать, используя linq?

справка была бы очень признательна.

Edit:

оригинальный JSON (это действительно жанры):

{"genres":[{"id":28,"name":"Action"},{"id":12,"name":"Adventure"}, 
{"id":16,"name":"Animation"},{"id":35,"name":"Comedy"}, 
{"id":80,"name":"Crime"},{"id":878,"name":"Science Fiction"}, 
{"id":10770,"name":"TV Movie"},{"id":53,"name":"Thriller"}, 
{"id":10752,"name":"War"},{"id":37,"name":"Western"}]} 

Тогда я использовал:

JavaScriptSerializer json_serializer = new JavaScriptSerializer(); 
Dictionary<string, object> obj = (Dictionary<string,object>)json_serializer.DeserializeObject(GenresStr); 
object[] genresArr = (object[])obj["genres"]; 

Так genresArr есть массив [[], []], каждый из inner [] имеет форму: ["id", некоторое целое] и ["имя", "некоторое имя"]

+0

Можете ли вы показать образец вашего массива объектов? –

+0

И было бы хорошо видеть JSON. –

+0

вы можете сначала Deserialize вашего json-массива на 'var', и с этого момента вы можете получить доступ к нему как можно проще из' List' –

ответ

1

Я думаю, вы не совсем понимаете, что такое JSON. И еще одна странная вещь, что вы хотите иметь список людей, в то время как ваш JSON содержит список жанров.

Чтобы десериализовать этот JSON, вам сначала нужно создать соответствующую модель. Вы всегда можете использовать http://json2csharp.com для помощи:

public class Genre 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class RootObject 
{ 
    public List<Genre> Genres { get; set; } 
} 

Тогда вам просто нужно одну строку кода. Я использую JSON.NET (это намного лучше, чем JavaScriptSerializer) в этом примере:

var obj = JsonConvert.DeserializeObject<RootObject>(json); 
+0

json2csharp сделал это! Я добавил правильные классы, которые он создал, а затем: var objData = JsonConvert.DeserializeObject (GenresStr); Список g = objData.genres; –

+0

Если это сработало, вы также можете отметить этот ответ как принятый. –

+0

. Я все еще участвую в использовании stackoverflow ... btw, я обращаюсь к нему как к классу «людей» без уважительной причины, просто не думал, что это важно для понимания проблемы. Спасибо! –

1

Вы c проанализируйте свой объект JSON напрямую с моделью с помощью пакета nuget Newtonsoft.Json.

var objData = JsonConvert.DeserializeObject<MyData>(jsonString); 

Вы можете получить свой класс модели из данных JSon из http://json2csharp.com/

Вы можете конвертировать с помощью динамического объекта, а

var objData = JsonConvert.DeserializeObject<dynamic>(jsonString); 

Или без указания модели Calss

var objData = JsonConvert.DeserializeObject(jsonString); 

Так ваш objData будет списком жанров, из которого вы можете получить данные, используя простые операции LINQ.

0

Если предположить, что у вас уже есть C# массивы, вы можете использовать этот LINQ подход, основанный на:

var ids = new int[] { 10, 20, 30 }; 
var names = new String[] { "A", "B", "C" }; 
var personArray = ids.Zip(names, (id, name) => new Person(id, name)).ToArray(); 
+0

не пробовал это, решение Александра отлично работало ...; -> –

Смежные вопросы