我有一个非常简单的类,用于将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;
}
这会对字符串进行反序列化,但在字符串包含空值(例如
)时会死掉["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.Collections.Generic。 Dictionary`2 [System.String,System.String]'因为类型需要JSON对象(例如{“name”:“value”})才能正确反序列化。 要修复此错误,请将JSON更改为JSON对象(例如{“name”:“value”})或将反序列化类型更改为数组或实现集合接口的类型(例如ICollection,IList),例如List从JSON数组反序列化。 JsonArrayAttribute也可以添加到类型中以强制它从JSON数组反序列化。 路径'',第1行,位置1.-在Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureArrayContract(Newtonsoft.Json.JsonReader reader,System.Type objectType,Newtonsoft.Json.Serialization.JsonContract contract)[0x00000] in:0 at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(Newtonsoft.Json.JsonReader reader,System.Type objectType,Newtonsoft.Json.Serialization.JsonContract contract,Newtonsoft.Json.Serialization.JsonProperty member,System.Object existingValue,System.String id )[0x00000] in:0 在Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(Newtonsoft.Json.JsonReader reader,System.Type objectType,Newtonsoft.Json.Serialization.JsonContract contract,Newtonsoft.Json.Serialization.JsonProperty member,Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft.Json.Serialization.JsonProperty containerMember,System.Object existingValue)[0x00000] in:0 at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(Newtonsoft.Json.JsonReader reader,System.Type objectType,Boolean checkAdditionalContent)[0x00000] in:0
在反序列化JSON字符串时,是否有一种忽略空值(和键)的简单方法?
答案 0 :(得分:1)
它与null值无关。这是因为输入表示JSON Array(一系列值),并且不能直接映射到Dictionary(一组键值对)。
尝试使用非空值,您将获得相同的结果。
无法反序列化当前的 JSON数组(例如[1,2,3])..因为[Dictionary]类型需要 JSON对象(例如{&# 34; name&#34;:&#34; value&#34;})正确反序列化。
可以说正确的解决方案是获取并解析JSON Object 输入。将发布的JSON与此变体进行比较,即使使用空值,也可以进行反序列化。
{"ImplementID": null, "ImplementType": "Flexicoil Airseeder", "SeedUnits": "Kg/H"}
但是,如果您无法以合理的形式获取JSON,只需将JSON对象作为List进行derserialize,然后根据需要将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;
}