【发布时间】:2015-07-22 02:39:30
【问题描述】:
我的任务是对 PSON(PowerShell 对象表示法)文件进行反序列化,并且正在努力使其正常工作。 显然 PSON 文件是 Puppet 使用的 JSON 的变体,它对字符串进行不同的编码 - 根据 this source
我已经尝试使用标准的 JSON.Net DeserializeObject 方法:
using (var r = new StreamReader(psonFilePath))
{
string json = r.ReadToEnd();
dynamic jsonObject = JsonConvert.DeserializeObject(json);
}
以上代码抛出异常:
"解析值时遇到意外字符:@.Path '', 第 0 行,位置 0。”
这是有道理的,因为标准 JSON 文件的开头不会有“@”。
PSON 文件示例如下:
@{
shapes = @{
'SQ4297' = @{
shapeid = 'SQ4297'
shapetype = 'square'
sides = 'four'
colour = 'purple'
}
'SQ6281' = @{
shapeid = 'SQ6281'
shapetype = 'square'
sides = 'four'
colour = 'orange'
}
'TR14' = @{
shapeid = 'TR14'
shapetype = 'triange'
sides = 'three'
colour = 'green'
}
}
}
上面提到的链接表明
大多数解析器会从 PSON 产生可用的输出,如果它们是 指示将输入解释为 Latin-1 编码
我尝试过对 JSON 使用不同的编码,但无论我尝试哪种方式都会出现类似的错误。我也尝试删除“@”,但后来遇到问题,因为字符串没有用引号括起来,所以解析器再次出现异常。
【问题讨论】:
-
您确定您发布的内容是根据该链接的有效 PSON 吗?它说 “PSON 在对象、数组、数字、布尔值和空值的表示方面与 JSON 没有区别” 和 “PSON 字符串...必须以 " 字符开头和结尾"。您发布的内容与其中任何一个都不匹配。
-
嗯,这可以解释为什么它不起作用;-) 我错过了关于引号的部分。也许我需要回到文件源并获取有关文件应该如何使用的更多信息。
-
不仅仅是引号 - 事实上它有
@符号在那里,任何值之间没有逗号,=而不是:等等等等 -
@JamesThorpe 是的-点了,我将获得有关该文件及其来源的更多信息并更新问题。谢谢
-
一个有效的 PSON 文件的要点是它会反序列化自己。如果您在 PowerShell 中将其作为脚本块运行,它将重新创建其中的所有对象。
标签: c# json powershell json.net