json 使用C#将字符串转换为Dictionary〈string,List< string>>()类型的Dictionary [duplicate]

wgx48brx  于 2023-03-31  发布在  C#
关注(0)|答案(4)|浏览(195)

此问题在此处已有答案

Converting a string to a Dictionary of Dictionary<string, List> in C#(1个答案)
16小时前关门了。
我有一个字符串"{yhxj7027DO=[3], lzpd7453EH=[2, 3]}"。我想将其转换为new Dictionary<string, List<string>>()类型的字典。我尝试了以下方法

string = "{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.可能是什么问题?

khbbv19g

khbbv19g1#

你的问题是如何定义输入字符串的语法。首先,你没有命名变量input,这似乎是你的代码的其余部分所期望的。其次,你的value1value2value3不是变量。(编辑:您对问题的编辑删除了value1等应该插值的提示,但我留下了以下信息,以防您确实想要插值这些值。
可以使用字符串插值:

string input = $"{{yhxj7027DO=[{value1}], lzpd7453EH=[{value2}, {value3}]}}";

但是请注意,你必须通过加倍来转义{}字符。你也可以使用串联:

string input = "{yhxj7027DO=[" + value1 + "], lzpd7453EH=["+ value2 + ", " + value3 + "]}";

如果你需要在字符串中包含双引号,你可以使用“raw string literal”或者用\字符转义引号。

pbwdgjma

pbwdgjma2#

希望你不介意我稍微修改一下。我相信这可以达到你想要的效果。我内置了一些安全措施以防字符串不包含你所期望的内容。

string json = "{yhxj7027DO=[value1], lzpd7453EH=[value2, value3]}";
json = json.StartsWith("{") ? json.Substring(1) : json;
json = json.EndsWith("}") ? json.Substring(0, json.Length - 2) : json;
Dictionary<string, string[]> result = new Dictionary<string, string[]>();
foreach (var objects in json.Split("],"))
{
    var jsonSplitted = objects.Split("=");
    if (jsonSplitted?.Length >= 2)
    {
        var property = jsonSplitted[0]?.Trim();
        var value = jsonSplitted[1]?.Substring(1);
        var values = value?.Split(", ");
        if (property != null && values != null)
        {
            result.Add(property, values);
        }
    }
}
a2mppw5e

a2mppw5e3#

你可以使用正则表达式来实现。下面的例子可以用于你的输入,但需要改进。

Regex re = new Regex(@"((?<key>[a-zA-Z0-9]+)=)\[((?<value>\w+)[^\w\]]*)+\]");
    string input = "{yhxj7027DO=[value1], lzpd7453EH=[value2, value3]}";
    
    var matches = re.Matches(input);

    var results = new Dictionary<string, List<string>>();
    
    foreach(Match match in matches)
    {
        var values = match.Groups["value"].Captures.Select(x => x.Value);
        results.Add(match.Groups["key"].Value, new List<string>(values));
    }

    // Print results
    foreach(var pair in results)
    {
        Console.WriteLine($"{pair.Key}: {string.Join(", ", pair.Value)}");  
    }
j8yoct9x

j8yoct9x4#

您可以使用RegEx进行拆分,然后构建IDictionary<string, List<string>>

// The regex pattern to use for parsing the input string
string pattern = @"(([\w]+)=\[[0-9,]+\])";

// Your input string copied from your question
string input = @"{yhxj7027DO=[3],lzpd7453EH=[2,3]}";
RegexOptions options = RegexOptions.Multiline;
       
var dict = new Dictionary<string, List<string>>();
foreach (Match m in Regex.Matches(input, pattern, options))
{
    // The groups should match the parts of the input string 
    var index = m.Value.IndexOf("=");
    var first = m.Value.Substring(0, index);

    // Remove the leading and ending "[" and "]"
    var rest = m.Value.Substring(index + 1).Replace("[", "").Replace("]","");
    
    // Fill up the dictionarys values with the strings
    dict[first]= rest.Split(",").Select(s => $"{s}").ToList();
}

下面是dotnet fiddle中的工作示例

相关问题