我有一串键和值,格式如下:
KEY1=someValue, KEY2="Hello, World!", SOME.OTHER.KEY=Hello World!, KEY4="Hello, ""World""!"
如何使用C#将其转换为JSON字符串?这可能是使用正则表达式完成的,但我无法想出正确的模式。我也无法使用像Newtonsoft.Json
这样的库来弄清楚如何做到这一点。
我想要制作的JSON如下:
{
"KEY1":"someValue",
"KEY2":"Hello, World!",
"SOME.OTHER.KEY":"Hello World!",
"KEY4":"Hello, \"World\"!"
}
答案 0 :(得分:1)
好吧,使用更新后的问题中的嵌套引号会变得比较棘手。我看不到用任意级别的嵌套引号提取值的任何可行方法。 (对于正则表达式方法也是如此 - 仍然可以手动扫描字符串并计算与嵌套级别相关的后续引号数。)
假设我们仅使用一级嵌套引用字符串来限制自己,那么正则表达式将是:
(?<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正则表达式使用一堆命名组来管理,这样您就可以通过名称访问其中一个备用捕获组
[^,]*
- 匹配任何不包含逗号的序列)
- 结束第二个value
群组)
- 结束未命名的群组(?:,|$)
- 匹配逗号或字符串结尾(两者都可以完成该值)答案 1 :(得分:-3)
您可以按照说法使用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"
}