You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Json.NET将JObject转为Dictionary<string,string>时遇无效参数异常求助

解决Json.NET反序列化JObject到Dictionary<string, string>的异常问题

咱们先拆解你遇到的两个核心问题:

  1. 参数类型不匹配:你把已经反序列化得到的dynamic对象传给了JsonConvert.DeserializeObject<Dictionary<string, string>>,这个方法需要的是原始JSON字符串,而非已经解析后的对象,这直接触发了"无效参数"异常。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:25:52