2016-12-14 81 views
3

我有点卡在如何从一个对象内的对象获取值。我尝试了很多方法,但似乎无法返回值。如何从对象内的对象抽象值?

VAR结果返回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(); 

的最终目标是要遍历结果,并只返回多个值在这个例子中只有“A”和“B”会返回。我知道如何做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

我建议在Json.NET中使用'JObject'模型,而不是像这样的场景中使用强类型的反序列化。 – 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他想检查属性不仅是Stats还是? – mybirthname