Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@wukann

PowerShellでJSON配列を逆転させる

概要

ファイル内の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
0
Help us understand the problem. What are the problem?