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

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

新規登録して質問してみよう
ただいま回答率
85.50%
JSON

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

Unicode

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

Swift

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

Q&A

解決済

2回答

4198閲覧

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

taro_nii_chan

総合スコア207

JSON

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

Unicode

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

Swift

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

0グッド

1クリップ

投稿2017/09/15 20:53

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

#やった事
test.jsonを

json

1 [ 2 [ 3 { 4 "タイトル": "お寺ている" 5 }, 6 { 7 "コメント": "修行を積むのじゃ" 8 }, 9 { 10 "備考": "ご利益は4月1日23時59分59秒まで" 11 } 12 ], 13 [ 14 { 15 "タイトル": "目grep" 16 }, 17 { 18 "コメント": "基本のキ" 19 }, 20 { 21 "備考": "これ無くしてプログラミングはあり得ません" 22 } 23 ] 24]

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

swift

1 // jsonデータを読み込む 2 let file = Bundle.main.url(forResource: "test", withExtension: "json") 3 let data = try? Data(contentsOf: file!) 4 let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: []) 5 6 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>という出力を見やすくしたい

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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


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

例えば、

swift

1protocol MyCustomStringConvertible { 2 3 var myDescription: String { get } 4} 5 6 7extension MyCustomStringConvertible { 8 9 func simpleDescription(_ obj: Any) -> String { 10 11 var desc = "" 12 switch obj { 13 14 case let mine as MyCustomStringConvertible: 15 desc += "\(mine.myDescription)" 16 17 case let debug as CustomDebugStringConvertible: 18 desc += "\(debug.debugDescription)" 19 20 default: 21 desc += "\(obj)" 22 } 23 24 return desc 25 } 26} 27 28extension Array: MyCustomStringConvertible { 29 30 var myDescription: String { 31 32 var desc = "" 33 desc += "Array: [\n" 34 forEach { 35 desc += "\t" + simpleDescription($0) + "\n" 36 } 37 desc += "]\n" 38 39 return desc 40 } 41} 42 43extension Dictionary: MyCustomStringConvertible { 44 45 var myDescription: String { 46 47 var desc = "" 48 desc += "Dictionary: {\n" 49 forEach { 50 desc += "\t" + simpleDescription($0.0) 51 desc += " : " + simpleDescription($0.1) 52 desc += "\n" 53 } 54 desc += "}\n" 55 56 return desc 57 } 58}

swift

1if let array = jsonObj as? [Any] { 2 print(array.myDescription) 3}

のような感じで。

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

投稿2017/09/16 01:25

MasakiHori

総合スコア3384

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taro_nii_chan

2017/09/16 06:07

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

2017/09/16 06:16

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

2017/09/16 06:23

`Array`に変換して出力したのが ```swift if let array = jsonObj as? [Any] { print(array.myDescription) } ``` かと思うのですが、他の箇所でエラーが出てしまうのです。 YoichiKさんの回答をヒントにそのコメントに書いた方法でマルチバイトで表示されていますので これ以上原因を追求することもないかなと思いました。 せっかくご尽力いただいたのに申し訳なく思っております。 ご容赦下さいませ。
guest

0

ベストアンサー

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

Swift

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

投稿2017/09/16 01:07

YoichiK

総合スコア89

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taro_nii_chan

2017/09/16 05:46

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問