将JSON反序列化为JSON字符串包含空值的Dictionary



我有一个非常简单的类,用于将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;
}

这确实会取消字符串的序列化,但当字符串包含null值(例如)时就会终止

["ImplementID",null,"ImplementType","Flexicoil Airseeder","SeedUnits","Kg/H","SeedApplicationRate","75","CropType","Wheat(Morombi)","Fertiliser0ID","2edd3043","FertiliserRate0","100","FertiliserRateUnit0","Kg/H"]

带有以下复古

2014-04-23 01:39:07.212 myapp[63857:70b]哎哟,突然出现问题:无法将当前JSON数组(例如[1,2,3])反序列化为类型"System"。集合。通用的字典"2[System.String,System.String]",因为该类型需要JSON对象(例如{"name":"value"})才能正确反序列化。若要修复此错误,请将JSON更改为JSON对象(例如{"name":"value"}),或将反序列化的类型更改为数组或实现集合接口(例如ICollection、IList)的类型,例如可以从JSON数组反序列化的List。JsonArrayAttribute也可以添加到类型中,以强制它从JSON数组反序列化。路径",第1行,位置1。-在Newtonsoft。Json。序列化。JsonSerializerInternalReader。EnsureArrayContract(Newtonsoft.Json.JsonReader阅读器,System.Type objectType,Newtonsoft.Json.Serialization.JsonContract合同)[0x0000]in:0在Newtonsoft。Json。序列化。JsonSerializerInternalReader。CreateList(Newtonsoft.Json.JsonReader读取器,System.Type objectType,Newtonsoft.Json.Serialization.JsonContract合同,Newtonsoft.Json.Serilization.Json属性成员,System.Object existingValue,System.String id)[00x00000]在:0中在Newtonsoft。Json。序列化。JsonSerializerInternalReader。CreateValueInternal(Newtonsoft.Json.JsonReader阅读器,System.Type objectType,Newtonsoft.Json.Serialization.JsonContract合同,Newtonsoft.Json.Serilization.Json Property成员,Newtonoft.Json.Terialization.Json containerContract容器合同,Newton soft.Json.Serializtion.JsonProperty容器成员,System.Object existingValue)[00x00000]在:0在Newtonsoft。Json。序列化。JsonSerializerInternalReader。反序列化(Newtonsoft.Json.JsonReader读取器,System.Type对象类型,布尔检查AdditionalContent)[00x00000]在:0 中

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

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

使用非null值进行尝试,会得到相同的结果。

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

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

{"ImplementID": null, "ImplementType": "Flexicoil Airseeder", "SeedUnits": "Kg/H"}

但是,如果不能以合理的形式获得JSON,只需将JSON对象序列化为List,然后根据需要将List转换为Dictionary。

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;
}

相关内容

  • 没有找到相关文章

最新更新