使用Json.NET将JObject转为Dictionary<string,string>时遇无效参数异常求助
解决Json.NET反序列化JObject到Dictionary<string, string>的异常问题
咱们先拆解你遇到的两个核心问题:
- 参数类型不匹配:你把已经反序列化得到的
dynamic对象传给了JsonConvert.DeserializeObject<Dictionary<string, string>>,这个方法需要的是原始JSON字符串,而非已经解析后的对象,这直接触发了"无效参数"异常。 - JSON结构与目标类型不兼容:你的JSON里存在数组类型的字段(比如
eventid":["1108"]),但Dictionary<string, string>要求所有值都是string类型,数组无法直接被转换成字符串,这也是后续即使修正参数后可能报错的深层原因。
方案一:手动遍历JObject转换(最直观)
先把JSON反序列化为JObject,然后逐个处理每个键值对,将非字符串类型(比如数组)转换成你需要的字符串格式:
string json = "{\"action\":\"recognition\",\"command\":\"event\",\"eventid\":[\"1108\"],\"from_ip\":\"192.168.0.49\",\"user\":\"safetymaster\"}\n"; json = json.Replace("\n", ""); // 先反序列化为JObject JObject jObj = JObject.Parse(json); Dictionary<string, string> jsonDic = new Dictionary<string, string>(); foreach (var property in jObj.Properties()) { string value; if (property.Value.Type == JTokenType.Array) { // 将数组转为逗号分隔的字符串,比如["1108"] → "1108" value = string.Join(",", property.Value.Select(v => v.ToString())); } else { // 直接取字符串值 value = property.Value.ToString(); } jsonDic.Add(property.Name, value); }
方案二:自定义JsonConverter(更通用)
如果需要频繁处理这类JSON,可以写一个自定义转换器,自动将非字符串类型的值转为字符串:
public class StringConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(string); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JToken token = JToken.Load(reader); if (token.Type == JTokenType.Array) { return string.Join(",", token.Select(t => t.ToString())); } return token.ToString(); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { serializer.Serialize(writer, value); } }
然后使用转换器反序列化:
string json = "{\"action\":\"recognition\",\"command\":\"event\",\"eventid\":[\"1108\"],\"from_ip\":\"192.168.0.49\",\"user\":\"safetymaster\"}\n"; json = json.Replace("\n", ""); Dictionary<string, string> jsonDic = JsonConvert.DeserializeObject<Dictionary<string, string>>(json, new StringConverter());
原代码报错的根源
原代码中JsonConvert.DeserializeObject<dynamic>(json)已经把JSON解析成了动态对象,再把这个对象传给另一个DeserializeObject方法,相当于让Json.NET去序列化一个动态对象再反序列化,这完全是多余的操作,而且方法参数类型不匹配(需要string却传了object),所以抛出了无效参数异常。
内容的提问来源于stack exchange,提问作者Caglia
相关产品推荐
相关产品推荐

