反序列化JSON时需要忽略NULL值

时间:2019-08-30 16:48:26

标签: c# json xamarin json.net

我正在使用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中。有什么想法使它起作用吗?

谢谢!

2 个答案:

答案 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);