json - 使用来自 PowerShell 的注释转换为 JSON
问题描述
我有一个非常简单的 json,这段代码对他有用:
function Get-CustomHeaders() {
return Get-Content -Raw -Path $JsonName | ConvertFrom-Json
}
但是,如果我的 json 有任何评论// wololo
,它就会中断。让这个解析器接受评论会不会太难?
解决方案
另一个答案中的解决方案仅// comments
在它们位于行首(带或不带空格)时才删除,并且不会删除/* multiline comments */
此代码删除所有类型的//
和/* multiline comments */
/
$configFile = (Get-Content path-to-jsonc-file -raw)
# Keep reading, for an improvement
# $configFile = $configFile -replace '(?m)\s*//.*?$' -replace '(?ms)/\*.*?\*/'
正如@Jiří Herník 在他的回答中指出的那样,这个表达式不必考虑其中包含注释的字符串的情况,例如"url": "http://mydomian.com"
。要处理这种情况:
$configFile = $configFile -replace '(?m)(?<=^([^"]|"[^"]*")*)//.*' -replace '(?ms)/\*.*?\*/'
例如删除此文件中的注释:
{
// https://github.com/serilog/serilog-settings-configuration
"Serilog": {
"MinimumLevel": "Error", // Verbose, Debug, Information, Warning, Error or Fatal
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "D:\\temp\\MyService\\log.txt",
"rollingInterval": "Day",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] ({App}) ({Environment}) {Message:lj}{NewLine}{Exception}"
}
},
{/*
"Name": "Seq",*/
"Args": {
"serverUrl": "http://localhost:5341"
}
}
]
}
}
结果是:
{
"Serilog": {
"MinimumLevel": "Error",
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "D:\\temp\\MyService\\log.txt",
"rollingInterval": "Day",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] ({App}) ({Environment}) {Message:lj}{NewLine}{Exception}"
}
} ,
{
"Args": {
"serverUrl": "http://localhost:5341"
}
}
]
}
}
推荐阅读
- mysql - Datatables mysql详细信息外部文件
- ruby-on-rails - GmailV1/GmailService get_user_messages
- php - 获取父索引数组多维
- android - 如何阻止非启动器活动被破坏?
- java - Java BigInteger 添加看起来不正确
- kubernetes - 安装 kubernetes 时未找到有效的 GPG
- php - 当控制器中存在 PHP 错误时获取旧的缓存视图 - Laravel 5.6
- javascript - 为什么我们必须永远继续使用服务器和客户端语言
- java - 类加载器子系统创建的类对象存储在哪里?
- azure - Azure DevOps API 添加公钥