質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.99%

  • Swift

    6096questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • JSON

    936questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • Unicode

    60questions

    Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

読み込んだ json が Unicodeエンコードされるのをデコードしたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 263

taro_nii_chan

score 165

やりたい事

jsonデータファイルを読み込んで変数に代入しているのですが、
Unicodeエンコード(?)されてしまうので
デコードされた値を代入したいです。

やった事

test.jsonを

 [
  [
   {
   "タイトル": "お寺ている"
   },
   {
   "コメント": "修行を積むのじゃ"
   },
   {
   "備考": "ご利益は4月1日23時59分59秒まで"
   }
   ],
  [
   {
   "タイトル": "目grep"
   },
   {
   "コメント": "基本のキ"
   },
   {
   "備考": "これ無くしてプログラミングはあり得ません"
   }
   ]
]

とし、下の記述をしたところ、

        // jsonデータを読み込む
        let file = Bundle.main.url(forResource: "test", withExtension: "json")
        let data = try? Data(contentsOf: file!)
        let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: [])

        print(jsonObj as Any)

以下の出力がされました。

Optional(<__NSArrayI 0x170033740>(
<__NSArrayI 0x170056ef0>(
{
    "\U30bf\U30a4\U30c8\U30eb" = "\U304a\U5bfa\U3066\U3044\U308b";
},
{
    "\U30b3\U30e1\U30f3\U30c8" = "\U4fee\U884c\U3092\U7a4d\U3080\U306e\U3058\U3083";
},
{
    "\U5099\U8003" = "\U3054\U5229\U76ca\U306f\Uff14\U6708\Uff11\U65e5\Uff12\Uff13\U6642\Uff15\Uff19\U5206\Uff15\Uff19\U79d2\U307e\U3067";
}
)
,
<__NSArrayI 0x1700567a0>(
{
    "\U30bf\U30a4\U30c8\U30eb" = "\U76eegrep";
},
{
    "\U30b3\U30e1\U30f3\U30c8" = "\U57fa\U672c\U306e\U30ad";
},
{
    "\U5099\U8003" = "\U3053\U308c\U7121\U304f\U3057\U3066\U30d7\U30ed\U30b0\U30e9\U30df\U30f3\U30b0\U306f\U3042\U308a\U5f97\U307e\U305b\U3093";
}
)

)
)

 困っていること

  • 変数jsonObjの中のユニコードをデコードしたい
  • (ついで)<__NSArrayI 0x170033740>という出力を見やすくしたい

です。よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

JSONSerialization をしているということは、内部形式の(オブジェクト形式の)JSONフォーマットに変換しているということですので、出力がそうなるのは仕方がありません(そういう形式でjsonObjの中に格納されているということです)。
もし、見やすい(本来の)JSON形式でprintしたいのであれば、以下のように文字列形式に戻す必要があります。

let jsonStr = String(bytes: jsonObj, encoding: .utf8)!
print(jsonStr)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/16 14:46

    ```swift
    let jsonStr = String(data: data!, encoding: String.Encoding.utf8)
    print(jsonStr!)
    ```
    で出来ました。
    ありがとうございます。

    キャンセル

0

詳しくは調べていませんが、これは NSArray/NSDictionaryのdescriptionプロパティあるいはXcodeのコンソールの仕様です。
マルチバイト文字はまともに表示されません。


表示(出力レイアウト)を見やすくしたい場合は自力で何とかするしかないです。

例えば、

protocol MyCustomStringConvertible {

    var myDescription: String { get }
}


extension MyCustomStringConvertible {

    func simpleDescription(_ obj: Any) -> String {

        var desc = ""
        switch obj {

        case let mine as MyCustomStringConvertible:
            desc += "\(mine.myDescription)"

        case let debug as CustomDebugStringConvertible:
            desc += "\(debug.debugDescription)"

        default:
            desc += "\(obj)"
        }

        return desc
    }
}

extension Array: MyCustomStringConvertible {

    var myDescription: String {

        var desc = ""
        desc += "Array: [\n"
        forEach {
            desc += "\t" + simpleDescription($0) + "\n"
        }
        desc += "]\n"

        return desc
    }
}

extension Dictionary: MyCustomStringConvertible {

    var myDescription: String {

        var desc = ""
        desc += "Dictionary: {\n"
        forEach {
            desc += "\t" + simpleDescription($0.0)
            desc += " : " + simpleDescription($0.1)
            desc += "\n"
        }
        desc += "}\n"

        return desc
    }
}
if let array = jsonObj as? [Any] {
    print(array.myDescription)
}

のような感じで。

(書いてみたけど全然見やすくないですね、これ。すみません。)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/16 15:07

    何故か出力されたのは質問での出力とほぼ同様のものでした。
    こちらのミスによる可能性が高いと思うのですが、
    原因を追ってる余裕が無いので断念します。

    ありがとうございました。

    キャンセル

  • 2017/09/16 15:16

    NSArray/NSDictionaryでコンソールの文字が化けるのは仕様なのでいくら頑張っても治りませんよ
    Arrayに変換するなどしてください

    キャンセル

  • 2017/09/16 15:23

    `Array`に変換して出力したのが
    ```swift
    if let array = jsonObj as? [Any] {
    print(array.myDescription)
    }
    ```
    かと思うのですが、他の箇所でエラーが出てしまうのです。

    YoichiKさんの回答をヒントにそのコメントに書いた方法でマルチバイトで表示されていますので
    これ以上原因を追求することもないかなと思いました。

    せっかくご尽力いただいたのに申し訳なく思っております。
    ご容赦下さいませ。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Swift

    6096questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • JSON

    936questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • Unicode

    60questions

    Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。