繁体   English   中英

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

[英]Need to ignore NULL values when deserializing JSON

我正在使用JSON形式的一些简单的股票数据,并将其绘制在图表上。 除某些条目返回NULL值外,其他所有方法都工作正常,因为在该特定时间没有进行任何交易,因此没有价格数据。 这会在图表线上产生缺口。

因此,如果“关闭”值为null,我想将包括“分钟”和“音量”在内的整个块排除在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中。 有什么想法使它起作用吗?

谢谢!

NullValueHandling.Ignore在序列化时将忽略模型相关属性的空值。

反序列化时,您可能会考虑反序列化为IEnumerable<ChartData>然后根据毕竟是自定义逻辑使用“ Linq”过滤掉不需要的对象:“排除具有close == null的对象”。

例如(未经测试的空中代码):

var data = JsonConvert.DeserializeObject<IEnumerable<ChartData>>(content,jsonSettings)
    .Where(cd => cd.close != null)
    ;

var observableData = new ObservableCollection<ChartData>(data);

我相信序列化设置在“序列化”时更适用,并且当值为null时,您不希望为类的属性生成JSON。 在这种情况下,您要反序列化,因此JSON保持原样。

无论如何,如果由于“ close”为null而需要排除整个对象,则是否排除该属性都无关紧要,您仍然需要检查它。 @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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM