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

C#中将特定格式字符串转为Dictionary<string, List<string>>报错求解

问题分析:自定义格式字符串转Dictionary<string, List<string>>出错

问题描述

有一个格式为{yhxj7027DO=[3], lzpd7453EH=[2, 3]}的字符串,想要转换为Dictionary<string, List<string>>类型的字典。尝试了以下代码:

string input = "{yhxj7027DO=[value1], lzpd7453EH=[value2, value3]}";
var strArr = input.Replace("{", "").Replace("}", "").Split("]", StringSplitOptions.TrimEntries);
for (int i = 0; i < strArr.Length - 1; i++) strArr[i] += "]";
StringBuilder sb = new StringBuilder("{");
foreach (var item in strArr)
{
    var arr = item.Split("=");
    sb.Append("\"" + arr[0] + "\"" + ":" + arr[1] + ",");
}

sb.Append("}");
var json = sb.ToString().Replace(",}", "}");

Dictionary<string, string[]> result = JsonConvert.DeserializeObject<Dictionary<string, string[]>>(json);

运行时报错:Unexpected character encountered while parsing number: :. Path 'lzpd7453EH[0]', line 1, position 36.

错误原因

核心问题是手动拼接的JSON格式不合法:

  • JSON规范中,字符串必须用双引号包裹,但你拼接后的JSON里,数组元素(比如value1、2)没有加双引号,导致Json.NET解析时混淆了类型:无引号的数字会被识别为数值类型,而无引号的字母组合(比如value1)会被当成非法标识符,触发解析错误。
  • 举个例子,你拼接出的JSON片段是"yhxj7027DO":[value1],这不符合JSON规范,正确的应该是"yhxj7027DO":["value1"]。

解决方案

推荐两种更可靠的处理方式:

方式1:修正JSON拼接逻辑

在处理数组元素时,给每个元素加上双引号,确保JSON格式合法:

string input = "{yhxj7027DO=[value1], lzpd7453EH=[value2, value3]}";
var strArr = input.Replace("{", "").Replace("}", "").Split("]", StringSplitOptions.TrimEntries);
for (int i = 0; i < strArr.Length - 1; i++) strArr[i] += "]";
StringBuilder sb = new StringBuilder("{");

foreach (var item in strArr)
{
    var arr = item.Split("=");
    if (arr.Length != 2) continue;
    
    // 处理数组部分:给每个元素加双引号
    var arrayPart = arr[1].Trim('[', ']');
    var quotedValues = string.Join(",", arrayPart.Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries)
                                                .Select(v => $"\"{v}\""));
    var validArray = $"[{quotedValues}]";
    
    sb.Append($"\"{arr[0]}\":{validArray},");
}

sb.Append("}");
var json = sb.ToString().Replace(",}", "}");

Dictionary<string, List<string>> result = JsonConvert.DeserializeObject<Dictionary<string, List<string>>>(json);

方式2:直接解析原字符串(更推荐)

跳过JSON转换步骤,直接解析自定义格式的字符串,避免格式转换带来的问题:

string input = "{yhxj7027DO=[3], lzpd7453EH=[2, 3]}";
var dict = new Dictionary<string, List<string>>();

// 去掉首尾的大括号
var content = input.Trim('{', '}');
// 拆分每个键值对
var entries = content.Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries);

foreach (var entry in entries)
{
    // 拆分键和值数组部分(按"=["拆分)
    var parts = entry.Split(new[] { "=[" }, StringSplitOptions.None);
    if (parts.Length != 2) continue;
    
    var key = parts[0];
    // 去掉数组末尾的"]"并拆分元素
    var valuesStr = parts[1].TrimEnd(']');
    var values = valuesStr.Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries)
                          .ToList();
    
    dict.Add(key, values);
}

这种方式不需要依赖JSON序列化,逻辑更直接,也避免了JSON格式规范带来的限制。

内容的提问来源于stack exchange,提问作者user3841581

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:23:20