2016-12-14 2 views
3

Я немного зациклился на том, как получить значение от объекта внутри объекта. Я пробовал множество методов, но, похоже, не возвращал значение.Как абстрагировать значение от объекта внутри объекта?

результатов вара вернуться JSon это:

{ 
    "Date": "2016-12-14" 
    "Stats": { 
    "A": 9.23, 
    "B": 5.63, 
    "C": 0 
    } 
} 

Код, чтобы попробовать и доступ «Статистика» значение:

var apiResult = await client.GetStringAsync(url); 
var results = apiResult.DeserializeObject<StatsLA>(apiResult); 
object[] getValues = results.GetType() 
    .GetProperties() 
    .Select(p => 
     { 
      object value = p.GetValue(results); 
      return value == null ? null : value.ToString(); 
      }) 
     .ToArray(); 

Конечной целью является Переберите результаты и возвращать только те значения, которые больше чем 0. В этом примере возвращаются только «А» и «В». Я знаю, как сделать оператор loop/linq, но сначала мне нужно получить значения. Любые советы будут оценены или просто укажут в правильном направлении, как подойти.

Это класс файла:

public class StatsLA 
{ 
    public string Date { get; set; } 
    public LocalStats stats { get; set; } 
} 
public class LocalStats 
{ 
    public double A { get; set; } 
    public double B { get; set; } 
    public double C { get; set; } 
} 

Желаемый результат:

{ 
    "Date": "2016-12-14" 
    "Stats": { 
    "A": 9.23, 
    "B": 5.63 
    } 
} 
+1

Я предлагаю использовать модель JObject с Json.NET вместо строго типизированной десериализации в таких сценариях. – Dai

ответ

0

Там нет необходимости Deserialize JSON объекта, потому что, когда вы удалите свойства из JSON, значение по умолчанию вашего объекта для свойства C по-прежнему 0, который будет генерировать тот же json.

Проверить full example at dotNetFiddle

public static void Main(string[] args) 
{ 
    string json = @"{ 
    ""Date"": ""2016-12-14"", 
    ""Stats"": { 
    ""A"": 9.23, 
    ""B"": 5.63, 
    ""C"": 0 
    } 
}"; 


    JObject result = JsonConvert.DeserializeObject<JObject>(json); 
    JObject statsObj = (JObject)result["Stats"]; 

    for(int i = statsObj.Properties().Count()-1; i>=0; i--) 
    { 
     var propValue = statsObj.Properties().Skip(i).FirstOrDefault(); 

     if (decimal.Parse(propValue.Value.ToString()) <= 0) 
      propValue.Remove(); 
    } 

    string endResult = result.ToString(); 

} 

Если в Stats объекте, имеет значение, отличное от типа десятичного, используйте decimal/double.TryParse и удалить элемент, если TryParse верно и значение из вне double/decimal <= 0.

+0

Но теперь OP должен проверить конкретные типы, которые являются 0 .... –

+0

@ L.B хорошо он может использовать double.TryParse – mybirthname

+0

@ L.B он хочет проверить свойства не только статистики или? – mybirthname

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