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

时间:2014-04-23 00:41:58

标签: 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.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字符串时,是否有一种忽略空值(和键)的简单方法?

1 个答案:

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