我的任务是反序列化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);
}

上面的代码引发异常:



这很有意义,因为标准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'
        }
    }
}

上面提到的链接指出



我尝试将不同的编码与JSON结合使用,但是无论尝试哪种方式,都会遇到类似的错误。我还尝试删除了“@”,但是由于字符串没有用引号引起来而使解析器异常再次出现,因此遇到了问题。

最佳答案

我认为PSON在这里有两种不同的含义。

与PowerShell相关的

  • PSON是指PowerShell对象表示法。这是用于将PowerShell数据对象存储在文件中的格式。 PSON文件的一项有用功能是,在PowerShell中执行时,它可以自行反序列化。

    有关更多信息,请参见以下问题:Save hash table in PowerShell object notation (PSON)

    您所质疑的文件是有效的PowerShell PSON文件。
  • 另一个PSON似乎是Protocol JSON 。 “JSON的超高效二进制序列化格式”,对此我一无所知。
  • 08-17 17:48