- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一串键和值,格式如下:
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\"!"
}
最佳答案
好吧,使用更新问题中的嵌套引号,事情变得更加棘手。我看不到任何可行的方法来提取具有任意级别的嵌套引号的值。 (正则表达式方法也是如此——仍然可以手动扫描字符串并根据嵌套级别计算后续引号的数量。)
假设我们只使用一层嵌套引用字符串来限制自己,则正则表达式为:
(?<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 flavor 维护了一堆命名组,因此您可以简单地通过名称访问任一替代捕获组
[^,]*
- 匹配任何不包含逗号的序列)
- 结束第二个value
小组)
- 结束未命名组(?:,|$)
- 匹配逗号或字符串结尾(两者都应完成值)关于c# - 将 key=value 字符串转换为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38826620/
我正在尝试使用 flot 绘制 SQL 数据库中的数据图表,这是使用 php 收集的,然后使用 json 编码的。 目前看起来像: [{"month":"February","data":482},
我有一个来自 php 行的 json 结果,类似于 ["value"]["value"] 我尝试使用内爆函数,但得到的结果是“value”“value” |id_kategori|created_at
脚本 1 将记录 two 但浏览器仍会将 select 元素呈现为 One。该表单还将提交值 one。 脚本 2 将记录、呈现和提交 两个。我希望它们是同义词并做同样的事情。请解释它们为何不同,以及我
我的python字典结构是这样的: ips[host][ip] 每行 ips[host][ip] 看起来像这样: [host, ip, network, mask, broadcast, mac, g
在 C# 中 我正在关注的一本书对设置和获取属性提出了这样的建议: double pri_test; public double Test { get { return pri_test; }
您可能熟悉 enum 位掩码方案,例如: enum Flags { FLAG1 = 0x1, FLAG2 = 0x2, FLAG3 = 0x4, FLAG4 = 0x8
在一些地方我看到了(String)value。在一些地方value.toString() 这两者有什么区别,在什么情况下我需要使用哪一个。 new Long(value) 和 (Long)value
有没有什么时候 var result = !value ? null : value[0]; 不会等同于 var result = value ? value[0] : null; 最佳答案 在此处将
我正在使用扫描仪检测设备。目前,我的条形码的值为 2345345 A1。因此,当我扫描到记事本或文本编辑器时,输出将类似于 2345345 A1,这是正确的条形码值。 问题是: 当我第一次将条形码扫描
我正在读取 C# 中的资源文件并将其转换为 JSON 字符串格式。现在我想将该 JSON 字符串的值转换为键。 例子, [ { "key": "CreateAccount", "text":
我有以下问题: 我有一个数据框,最多可能有 600 万行左右。此数据框中的一列包含某些 ID。 ID NaN NaN D1 D1 D1 NaN D1 D1 NaN NaN NaN NaN D2 NaN
import java.util.*; import java.lang.*; class Main { public static void main (String[] args) thr
我目前正在开发我的应用程序,使其设计基于 Holo 主题。在全局范围内我想做的是工作,但我对文件夹 values、values-v11 和 values-v14. 所以我知道: values 的目标是
我遇到了一个非常奇怪的问题。 我的公司为我们的各种 Assets 使用集中式用户注册网络服务。我们一般通过HttpURLConnection使用请求方法GET向Web服务发送请求,通过qs设置参数。这
查询: UPDATE nominees SET votes = ( SELECT votes FROM nominees WHERE ID =1 ) +1 错误: You can't specify
如果我运行一段代码: obj = {}; obj['number'] = 1; obj['expressionS'] = 'Sin(0.5 * c1)'; obj['c
我正在为我的应用创建一个带有 Twitter 帐户的登录页面。当我构建我的项目时会发生上述错误。 values/strings.xml @dimen/abc_text_size_medium
我在搜索引擎中使用以下 View : CREATE VIEW msr_joined_view AS SELECT table1.id AS msr_id, table1.msr_number, tab
为什么验证会返回此错误。如何解决? ul#navigation li#navigation-3 a.current Value Error : background-position Too
我有一个数据名如下 import pandas as pd d = { 'Name' : ['James', 'John', 'Peter', 'Thomas', 'Jacob', 'Andr
我是一名优秀的程序员,十分优秀!