我正在使用JSON形式的一些简单的库存数据,并将其绘制在图表上。除某些条目返回NULL值外,其他所有方法都工作正常,因为在该特定时间没有进行任何交易,因此没有价格数据。这会在图表线上产生缺口。
因此,如果“ close”值为null,我想将包括“ minute”和“ volume”的整个块排除在ObservableCollection中之外,然后继续添加下一个不为null的值。 JSON示例:
{
"minute": "10:21",
"close": null,
"volume": 0,
},{
"minute": "10:22",
"close": 47.56,
"volume": 6,
}
我创建了一个jsonSettings属性,我已经看到人们谈论并声称可以使用它,但是它不起作用。代码如下:
var jsonSettings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
MissingMemberHandling = MissingMemberHandling.Ignore
};
string content = await _client.GetStringAsync(url);
var json_Data = JsonConvert.DeserializeObject<ObservableCollection<ChartData>>(content,jsonSettings);
viewModel.LineData = json_Data;
这是我的模特:
public class ChartData
{
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string minute { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public double? close { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public int volume { get; set; }
}
public class ViewModel
{
public ObservableCollection<ChartData> LineData { get; set; }
public ViewModel()
{
LineData = new ObservableCollection<ChartData>();
}
}
我尝试了许多在此处和此处发布的类似示例,但空值条目仍保留在json_Data中。有什么想法使它起作用吗?
谢谢!
答案 0 :(得分:2)
NullValueHandling.Ignore
会在序列化时忽略模型相关属性的空值。
反序列化时,您可能会考虑反序列化为IEnumerable<ChartData>
,然后使用Linq来过滤掉不需要的对象,这毕竟是自定义逻辑:“排除具有close ==的对象空”。
例如(未经验证的空中代码):
var data = JsonConvert.DeserializeObject<IEnumerable<ChartData>>(content,jsonSettings)
.Where(cd => cd.close != null)
;
var observableData = new ObservableCollection<ChartData>(data);
答案 1 :(得分:0)
我相信序列化设置在“序列化”时更适用,并且当值为null时,您不希望为类的属性生成JSON。在这种情况下,您要反序列化,因此JSON保持原样。
无论如何,如果由于“ close”为空而需要排除整个对象,则是否排除该属性都无关紧要,您仍然需要检查它。 @Jason不愿做的事情是分别过滤。像这样:
JArray json = JArray.Parse(@"
[{
""minute"": ""10:21"",
""close"": null,
""volume"": 0,
},{
""minute"": ""10:22"",
""close"": 47.56,
""volume"": 6,
}]
");
var filteredJson = json.Where(j => j["close"].Value<double?>() != null);