将key=value字符串转换为JSON
本文关键字:转换 JSON 字符串 value key | 更新日期: 2023-09-27 18:01:20
我有一个键和值的字符串,格式如下:
KEY1=someValue, KEY2="Hello, World!", SOME.OTHER.KEY=Hello World!, KEY4="Hello, ""World""!"
如何使用c#将其转换为JSON字符串?这可能可以使用Regex完成,但我不能提出正确的模式。我也不知道如何使用像Newtonsoft.Json
这样的库来做到这一点。
我想生成的JSON如下:
{
"KEY1":"someValue",
"KEY2":"Hello, World!",
"SOME.OTHER.KEY":"Hello World!",
"KEY4":"Hello, '"World'"!"
}
好吧,从更新的问题中嵌套引号,事情变得更加棘手。我看不出有任何可行的方法可以从任意级别的嵌套引号中提取值。(对于regex方法也是如此——仍然可以手动扫描字符串,并根据嵌套级别计算后续引号的数量。)
假设我们限制自己只有一层嵌套的引号字符串,正则表达式将是:
(?<key>[^=,'s]+)=(?:"(?<value>(?:[^"]|""[^"]*"")*?)"|(?<value>[^,]*))(?:,|$)
然后你可以找到所有匹配并根据JSON规则重新格式化对:
var input = @"KEY1=someValue, KEY2=""Hello, World!"",
SOME.OTHER.KEY=Hello ""World""!,
KEY4=""Hello, """"World""""!"",
KEY5=""Hello, """"World""""!"",
KEY6=""""""Hello"""", """"World""""!""";
var pairs = Regex.Matches(input, @"(?<key>[^=,'s]+)=(?:""(?<value>(?:[^""]|""""[^""]*"""")*?)""|(?<value>[^,]*))(?:,|$)")
.Cast<Match>()
.Select(m =>
string.Format(" {0}: {1}",
JsonConvert.ToString(m.Groups["key"].Value),
JsonConvert.ToString(m.Groups["value"].Value.Replace("'"'"", "'""))));
var json = "{'n" + string.Join(",'n", pairs) + "'n}";
正则表达式的解释:
-
(?<key>
—启动名称为key
的抓包组-
[^=,'s]+
-匹配任何非空字符序列,不包括=
,,
和空白 -
)
-结束key
组
-
-
=
-匹配等号 -
(?:
-启动一个未命名的组,用于分组备选方案- 第一个备选项-引用值:
-
"
-文字开头引号 -
(?<value>
—启动名称为value
的抓包组-
(?:[^"]|""[^"]*"")*
-匹配任何非引号或引号字符串的序列(请不要双引号) -
?
-使前一个匹配非贪婪 -
)
-结束value
组
-
-
"
-文字结束引号 -
|
-替代分隔符 - 第二个选项-未引用的值:
-
(?<value>
-启动另一个value
捕获组- .NET regex风味维护了一个命名组堆栈,因此您可以简单地通过名称访问可选的捕获组-
[^,]*
-匹配任何不包含逗号的序列 -
)
-结束第二个value
组
-
-
)
-结束未命名组
-
(?:,|$)
-匹配逗号或字符串的结尾(两者都期望完成值)
您可以使用您所说的Newtonsoft
。
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
函数中的用法
public string ConvertJSON()
{
Person p = new Person();
p.FirstName = "Khan";
p.LastName = "Imran";
string json = "";
return json = JsonConvert.SerializeObject(p);
}
{
"FirstName": "Khan",
"LastName" : "Imran"
}