Help us understand the problem. What is going on with this article?

PowerShellでJSON配列を逆転させる

More than 3 years have passed since last update.

概要

ファイル内のJSON配列を逆転させ、別ファイルに出力するPowerShellスクリプトを作ってみました。ポイントは、PowerShellのJSON関連コマンドレットとUnicodeエスケープに対する処理でしょうか。

スクリプト

Reverse-JsonArray.ps1
Param([string]$from, [string]$to)
$data = (Get-Content $from -Raw -Encoding UTF8 | ConvertFrom-Json)
$data = $data[($data.length-1)..0]
[Regex]::Unescape((ConvertTo-Json $data)) | Set-Content -Path $to -Encoding UTF8

使い方

PS > Reverse-JsonArray.ps1 -from input.json -to output.json

入出力共にUTF8に設定してあるので、他のエンコーディングを利用する場合はその辺いじってくださいな。

入力例

input.json
[
    {
        "group": 1,
        "leader": "souji",
        "leader_jp": "総司"
    },
    {
        "group": 2,
        "leader": "shinpachi",
        "leader_jp": "新八"
    },
    {
        "group": 3,
        "leader": "hajime",
        "leader_jp": "一"
    },
    {
        "group": 4,
        "leader": "chuji",
        "leader_jp": "忠司"
    },
    {
        "group": 5,
        "leader": "kanryusai",
        "leader_jp": "観柳斎"
    },
    {
        "group": 6,
        "leader": "genzaburo",
        "leader_jp": "源三郎"
    },
    {
        "group": 7,
        "leader": "sanjuro",
        "leader_jp": "三十郎"
    },
    {
        "group": 8,
        "leader": "heisuke",
        "leader_jp": "平助"
    },
    {
        "group": 9,
        "leader": "mikisaburo",
        "leader_jp": "三樹三郎"
    },
    {
        "group": 10,
        "leader": "sanosuke",
        "leader_jp": "左之助"
    },
    {
        "memo": "<>&#/,."
    }
]

出力

output.json
[
    {
        "memo":  "<>&#/,."
    },
    {
        "group":  10,
        "leader":  "sanosuke",
        "leader_jp":  "左之助"
    },
    {
        "group":  9,
        "leader":  "mikisaburo",
        "leader_jp":  "三樹三郎"
    },
    {
        "group":  8,
        "leader":  "heisuke",
        "leader_jp":  "平助"
    },
    {
        "group":  7,
        "leader":  "sanjuro",
        "leader_jp":  "三十郎"
    },
    {
        "group":  6,
        "leader":  "genzaburo",
        "leader_jp":  "源三郎"
    },
    {
        "group":  5,
        "leader":  "kanryusai",
        "leader_jp":  "観柳斎"
    },
    {
        "group":  4,
        "leader":  "chuji",
        "leader_jp":  "忠司"
    },
    {
        "group":  3,
        "leader":  "hajime",
        "leader_jp":  "一"
    },
    {
        "group":  2,
        "leader":  "shinpachi",
        "leader_jp":  "新八"
    },
    {
        "group":  1,
        "leader":  "souji",
        "leader_jp":  "総司"
    }
]

解説

PowerShellのJSON関連コマンドレットが便利、ということで作ってみました。ConvertFrom-JsonやConvertTo-JsonでJSON<->オブジェクト変換が一発でできるのは(・∀・)イイネ!!
ちなみに、最後の行で.NETライブラリのRegex.Unescapeを使っていますが、これがないとmemoの値がこんな↓になってしまいます。

    {
        "memo":  "\u003c\u003e\u0026#/,."
    }

こんな具合に、一部の記号がUnicodeエスケープされて出力されます。出力後のJSONを純粋にデータとして扱う場合、むしろこちらの方がセキュリティ面から考えるといいと思います。が、自分の場合は出力後のJSONを人が読めるものにする必要があったため、Unicodeエスケープを解除しています。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away