SwiftUI JSONキーにハイフン(-)が付いている場合の対処 hyphen

hyphen json JSONEncoder

前回、SwiftJSONDecoderを使った処理方法を書きました。今回JSONキーにハイフンが混ざった処理をご紹介します。ハイフン(hyphen)が入った変数を作成することができません。ビルドエラーになってしまいます。しかしWeb上のAPIにはハイフンが混ざったキーもよく見かけます。例えば下記のようなJSONです。

{ "name-1": "Lenina Crowne" }

この場合”name1“なので下記のようにしたいのですがこれではビルドできません。

ビルドエラー
ビルドエラー

JSONキーにハイフンが含まれる場合CodingKeyが含まれたenum宣言を構造体に埋めてキー名の変換を行います。

struct TJson : Codable {
    var name1: String
    enum CodingKeys : String, CodingKey {
        case name1 = "name-1"
    }
}

enumの名称は「CodingKeys」とする必要があるようです。他の名前ではビルドは成功するものの実行するとエラーになりました。

struct TCodingKeyJSONView: View {
    @State var json1 = """
        { "name-1": "Lenina Crowne" }
    """
    var body: some View {
        Text(jsonConvert(json1).name1)
    }
    func jsonConvert(_ s1: String) -> TJson {
        do {
            return try JSONDecoder().decode(TJson.self, from: s1.data(using: .utf8)! )
        } catch {
            return TJson(name1: "")
        }
    }
}

ハイフンキーが入ったJSONの処理ができました。
ハイフンキーが入ったJSONの処理ができました。

JSONEncoderを使ってTJsonからJSON文字列に変換も試してみました。

struct TCodingKeyJSONView: View {
    var body: some View {
        Text(tJsonToJsonStr(TJson(name1: "Bernard Marx")))
    }
    func tJsonToJsonStr(_ j: TJson) -> String{
        let enc = JSONEncoder()
        do {
            let d1 = try enc.encode(j)
            return String(data: d1, encoding: .utf8)!
        } catch {
            return "{}"
        }
    }
}

JSONEncoderもうまく動きました。

ハイフンキー付きJSON作成する場合のJSONEncoder
ハイフンキー付きJSON作成する場合のJSONEncoder

JavaScript 配列のソート

SafariのJavaScriptコンソールで配列ソート実行

JavaScriptはデータを連続で並べた配列という変数を持たせることができます。配列は文字列や数値とJSONを配列で扱えます。通常の変数では var a = 100と一つの値をセットしますが、配列数値の場合var a = [100, 200, 300]数値をいくつも入れることができます。たくさんのデータが入るJavaScriptの配列には、ソート(sort)という並べ替えできる機能が付いています。数値の場合[9,8,2,6,5,3]という不揃いの配列の場合ソートは下記のように記述します。

var a = [9,8,2,6,5,3]
console.log(a.sort())

SafariのJavaScriptコンソール(⌘⌥c)で実行すると下記の結果が出ました。

JavaScriptシンプルな配列ソート例
JavaScriptシンプルな配列ソート例

JavaScript配列ソートは、降順に並び替えることもできます。下記は降順した場合のお例です。

var x = [9,8,2,6,5,3]
console.log(x.sort((a,b) => {
    return (a >= b)? -1: 1 
}))

文字列も同じようにソートできます。降順でのコード例です。

var x = ["あいうえお","かきくけこ","サシスセソ"]
console.log(x.sort((a,b) => {
    return (a >= b)? -1: 1 
}))
文字列配列での降順ソート例
文字列配列での降順ソート例

文字列型“あいうえお”の変数を配列に変換した後ソートする場合

var x = "あいうえお"
x.split("").sort((a,b) => {
    return (a >= b)? -1: 1 
}).forEach(_elem => {
    console.log(_elem)
})
文字列をsplitで配列に変換し降順ソートした結果
文字列をsplitで配列に変換し降順ソートした結果

[].sort((a,b) => {})のa,bは、文字列数値以外のオブジェクトにも使えます。

文字列”あいうえお”を一旦id, valueで構造化し、その後に降順にした例です。

let x = "あいうえお"
let y = []
x.split("").sort().forEach((_elem, _index, _my) => {
    y.push({id: _index, key1: _elem})
})
console.log(y.sort((a,b) => {
    return (a.id >= b.id)? -1 : 1
}))
JavaScriptコンソールで実行
JavaScriptコンソールで実行
2022 MJELD TECHNOLOGIES. ALL RIGHTS RESERVED