C# 将JSON反序列化到字典,其中JSON字符串包含空值

C# 将JSON反序列化到字典,其中JSON字符串包含空值,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,我有一个非常简单的类,用于将JSON字符串反序列化到字典中 private static Dictionary<string,string> DeserializeJSON(string json) { var dict = new Dictionary<string,string>(); if (string.IsNullOrEmpty(json)) return dict; var jsDict = JsonConvert.De

我有一个非常简单的类,用于将JSON字符串反序列化到字典中

private static Dictionary<string,string> DeserializeJSON(string json)
{
    var dict = new Dictionary<string,string>();
    if (string.IsNullOrEmpty(json))
       return dict;

    var jsDict = JsonConvert.DeserializeObject<Dictionary<string,string>>(json);
    if (jsDict != null)
         dict = jsDict;
    return dict;
}
以下面的回溯

2014-04-23 01:39:07.212 myapp[63857:70b]哎哟,有什么突然发生了:无法将当前JSON数组(例如[1,2,3])反序列化为类型“System.Collections.Generic.Dictionary`2[System.String,System.String]”,因为该类型需要一个JSON对象(例如{“name”:“value”})才能正确反序列化。 要修复此错误,请将JSON更改为JSON对象(例如{“name”:“value”}),或将反序列化类型更改为数组或实现可从JSON数组反序列化的集合接口(例如ICollection、IList)类似列表的类型。还可以将JsonArrayAttribute添加到类型中,以强制它从JSON数组反序列化。 路径“”,第1行,位置1.-位于Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ensurearaycontract(Newtonsoft.Json.JsonReader-reader,System.Type objectType,Newtonsoft.Json.Serialization.JsonContract-contract)[0x00000]in:0 位于Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(Newtonsoft.Json.JsonReader,System.Type objectType,Newtonsoft.Json.Serialization.JsonContract,Newtonsoft.Json.Serialization.JsonProperty成员,System.Object existingValue,System.String id)[0x00000 in:0 位于Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(Newtonsoft.Json.JsonReader阅读器,System.Type objectType,Newtonsoft.Json.Serialization.JsonContract契约,Newtonsoft.Json.Serialization.JsonProperty成员,Newtonsoft.Json.Serialization.JsonContainerContract容器契约,Newtonsoft.Json.Serialization.JsonProperty容器成员,System.Object existingValue)[0x00000]in:0 在Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(Newtonsoft.Json.JsonReader,System.Type objectType,Boolean checkAdditionalContent)[0x00000]中:0


在反序列化JSON字符串时,有没有一种简单的方法可以忽略空值(和键)?

它与空值无关。这是因为输入表示一个(值序列),不能直接映射到字典(一组键值对)

尝试使用非空值,您将得到相同的结果

无法反序列化当前JSON数组(例如[1,2,3]),因为[Dictionary]类型需要一个JSON对象(例如{“name”:“value”})才能正确反序列化

可以说,正确的解决方案是获取并解析JSON对象输入。将发布的JSON与此变体进行比较,即使使用空值,也可以进行反序列化

{"ImplementID": null, "ImplementType": "Flexicoil Airseeder", "SeedUnits": "Kg/H"}
但是,如果无法以合理的形式获取JSON,只需将JSON对象反序列化为列表,然后根据需要将列表转换为字典

var data = JsonConvert.DeserializeObject<List<string>>(json);
var dict = new Dictionary<string,string>();
for (var i = 0; i < data.length; i += 2) {
   var key = data[i];
   var value = data[i+1];
   dict[key] = value;
}
var data=JsonConvert.DeserializeObject(json);
var dict=新字典();
对于(变量i=0;i
var data = JsonConvert.DeserializeObject<List<string>>(json);
var dict = new Dictionary<string,string>();
for (var i = 0; i < data.length; i += 2) {
   var key = data[i];
   var value = data[i+1];
   dict[key] = value;
}