【问题标题】:C# quoted string within a quoted string带引号的字符串中的 C# 带引号的字符串
【发布时间】:2022-01-26 13:35:33
【问题描述】:

我正在尝试通过 C# 代码中的命令行在 JSON 文件上运行 JQ。 必需的参数之一包括空格和引号,因此它本身包含在引号之间。但是,此参数是从另一个包含引号的字符串格式化的:

var jq =  ".data[] | select(.name==\"mytest\") | .id == \"adxd\"";
var psi = new ProcessStartInfo
        {
            FileName = _exe,
            Arguments = $"-c \"{jq}\" {_settings.JSONFile}",
        };

然而,论据结果是:

-c ".data[] | select(.name=="mytest") | .id == "adxd"" json.json

这当然是错的。 结果应该是:

-c ".data[] | select(.name==\"mytest\") | .id == \"adxd\"" json.json

如何确保使用正确的引号“级别”正确解码参数?

【问题讨论】:

  • This 应该有所帮助,但我正在努力寻找更好的东西。
  • 你需要转义\。 ==\\\"我的测试\\\"。
  • 我不禁想知道你为什么选择使用 jq 来做这个?
  • 我愿意接受@Llama 的其他建议!我谦虚的研究把我带到了stedolan.github.io/jq
  • 也许是 .NET 库 JSON.NET?

标签: c# json jq


【解决方案1】:

问问自己:“为什么在查询参数周围有引号?”

那是因为您要添加 转义 引号。这里的想法是在“代码”中写入\" 会在输出中呈现"

您的问题是您需要向下一层执行此操作。您不想渲染查询中的引号在 C# 中,您想渲染引号在 jq.exe 应用程序中。所以你需要向后工作。

  • 在 jp.exe 中,值应该是"
  • 这意味着我们发送给它的任何内容(命令行参数)都需要转义:\"
  • 这意味着无论我们如何渲染命令行参数都需要生成\",并且因为这两个字符都需要转义,所以你可以这样做。
jq = jq.Replace("\"", "\\\"");

这表示“用反斜杠和引号替换我的 c# 字符串中的所有双引号”(本质上,只需在所有引号之前添加一个反斜杠)。

这会将呈现为abc "def" ghi 的c# 字符串转换为abc \"def\" ghi,这是您的命令行参数所期望的格式。

【讨论】:

    猜你喜欢
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 2020-05-11
    • 1970-01-01
    • 2011-04-16
    相关资源
    最近更新 更多