2016-12-20 8 views
1

Я пытаюсь декодировать объект JSON 'BuildTestPlans', чтобы узнать различный BuildID и сохранить все записи (например, BuildID 0 есть 2 записи), соответствующие ему, но запускаясь ниже ошибки , как это исправить?Ошибка при попытке декодирования объекта JSON

BuildTestPlans: 
[ 
    { 
    "BuildTestPlanID": 0, 
    "BuildID": 0, 
    "Build": "string", 
    "TestPlanMasterID": 0 

    }, 
{ 
    "BuildTestPlanID": 0, 
    "BuildID": 0, 
    "Build": "string1", 
    "TestPlanMasterID": 0 
    }, 
{ 
    "BuildTestPlanID": 1, 
    "BuildID": 1, 
    "Build": "string", 
    "TestPlanMasterID": 0 
} 
] 

public List<BuildTestPlan> AddOrUpdate(List<BuildTestPlan> BuildTestPlans) 
{ 
    foreach (var BuildID in BuildTestPlans.BuildID.Distinct()) 
    { 
     //save all records for each buildID 
    } 
    return null; 
} 

Ошибка:

List does not contain a definition for BuildID and no extension method 'BuildID' accepting a first argument of type 'List' could be found(are you missing a using directive or an assembly reference?)

+3

Этот не имеет никакого отношения к вашему json. Вы пытаетесь получить доступ к 'BuildID' в * списке *' BuildTestPlan'. Ваш код должен быть 'foreach (var buildId в BuildTestPlans.Select (btp => btp.BuildID) .Distinct())' – Rob

+0

@Rob - большое спасибо, как сохранить все соответствующие записи для каждого файла buildID, например BuildID 0 есть 2 записи – user3508811

+0

Вы бы просмотрели список, как и любой список. 'foreach (var build in BuildTestPlans) {}' – Rob

ответ

-2

Там в отсутствие распорка на вашем JSON перед закрывающей скобкой это должно работать

1

Предполагая BuildTestPlan.BuildID является int

// processed list, initially empty 
List<int> buildList = new List<int>(); 

foreach (var buildTestPlan in BuildTestPlans) 
{ 

    // if the BuildID was not previously processed 
    if (buildList.IndexOf(buildTestPlan.BuildID) < 0){ 
     buildList.Add(buildTestPlan.BuildID); 
     // todo: process the buildTestPlan for this newly found BuildID 
    } 

    // if the BuildID was previously processed 
    else { 
     // todo: something else, or skip it 
    } 
} 
return null; 

Добавлен здесь относительно вашего комментария -

create a list of all the buildTestPlan for a BuildID

Предполагая, что вы хотите извлечь buildTestPlan для BuildID = 0, это, вероятно, список вы ожидаете.

var BuildTestPlans_WithParticularBuildId = BuildTestPlans.Select(c => c.BuildID == 0); 
+0

ydoww - можете ли вы объяснить, что 'buildList.IndexOf (buildTestPlan .BuildID' делает? Индекс конкретно – user3508811

+0

@ user3508811, это список, в котором хранится обработанный 'BuildID', конкретный код проверяет, была ли ранее обработана' BuildID'. Я создал эту логическую ветку, потому что в вашем «Distinct» есть «Distinct» Код. Вы можете захотеть обрабатывать по-разному для нового/существующего 'BuildID' – ydoow

+0

Я действительно хочу создать список всех' buildTestPlan' для BuildID, выше просто создает список BuildID's – user3508811

1

Список BuildTestPlans явно оленья кожа имеет BuildID, так как это Список BuildTestPlans и не объект, который вы можете получить доступ к нему, но индекс, как buildtestplans[0] здесь является то, как вы можете получить доступ к этому

public List<BuildTest> AddOrUpdate(List<BuildTest> BuildTestPlans) 
    { 
     List<int> BTPBuildID = new List<int>(); 
     foreach(var BuildTP in BuildTestPlans) 
     { 
      BTPBuildID.Add(BuildTP.BuildID); 
     } 
     BTPBuildID.Distinct(); 
     return null; 
    } 
Смежные вопросы