Непрерывный (способный к передаче туда и обратно) ConvertFrom-Json / ConvertTo-Json в Powershell - PullRequest
1 голос
/ 11 июля 2019

PowerShell по умолчанию не может надежно выполнять обход JSON. Как я могу убедиться, что такой JSON является правильно округленным?

Вот минимальный пример прерванной двусторонней сериализации:

PS> '{"a":[{"b":{}}]}' | ConvertFrom-Json | ConvertTo-Json -Compress
{"a":[{"b":""}]}

Неожиданное изменение с {} на "" приводит к JSON, который больше не действителен.

Это под версией 5.1:

PS> $PSVersionTable.PSVersion.ToString()
5.1.15063.674

Точно так же, '[{"b":{}]' | ConvertFrom-Json | ConvertTo-Json также сомнительно, как обсуждено в https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/15123162-convertto-json-doesn-t-serialize-simple-objects-pr. Однако, учтите, что сомнительная природа не покрыта этим вопросом.

1 Ответ

1 голос
/ 11 июля 2019

Немного о PEBKAC, немного о том, почему это поведение?!

Кажется, проблема с -Depth и логикой сокращения. Установка «более высокой глубины» приводит к тому, что поведение в обоих направлениях работает как положено. Наличие конца усечения в виде строки, в отличие от null, кажется неудачным - хотя, возможно, и последовательным, если кто-то обнаружит, что «To String» - правильное завершение.

Изменить на "" (неожиданно):

PS> '{"a":[{"b":{}}]}' | ConvertFrom-Json | ConvertTo-Json -Compress -Depth 2
'{"a":[{"b":""}]}'

Туда и обратно (ожидается):

PS> '{"a":[{"b":{}}]}' | ConvertFrom-Json | ConvertTo-Json -Compress -Depth 3
'{"a":[{"b":{}}]}'
...