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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

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

Q&A

解決済

2回答

2638閲覧

DynamicをClassにしたJSONにParseしたいです。

cancat

総合スコア313

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

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

0グッド

0クリップ

投稿2016/12/06 10:51

編集2016/12/06 10:57

こんにちは。
Windows10でWPFのアプリケーションを開発しています。
Visual Studio 2015 Communityを使っています。

###前提・実現したいこと
JSONをParseしたいです。

###試したこと
DynamicをClassを作ったところ、Parseに失敗しています。

###発生している問題・エラーメッセージ
型 'Newtonsoft.Json.JsonSerializationException' のハンドルされていない例外が mscorlib.dll で発生しました

追加情報:Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'memorytest.TodolyClass' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.

###該当のソースコード

C#

1 public async Task<TodolyClass> GetAllItems() { 2 if (NeedAuth()) { 3 var tokenResponse = await client.GetAsync(TokenUri); 4 // TODO トークン取得後にExpirationTimeを取得してローカルに保存とかすればいいかと。 5 } 6 7 var response = await client.GetAsync(UriOfItems); 8 var resultString = await response.Content.ReadAsStringAsync(); 9 10 return JsonConvert.DeserializeObject<TodolyClass>(resultString); 11 } 12

Class

1 public class TodolyClass { 2 public int Id { get; set; } 3 public string Content { get; set; } 4 public int ItemType { get; set; } 5 public bool Checked { get; set; } 6 public int ProjectId { get; set; } 7 public int? ParentId { get; set; } 8 public string Path { get; set; } 9 public bool Collapsed { get; set; } 10 public object DateString { get; set; } 11 public int DateStringPriority { get; set; } 12 public string DueDate { get; set; } 13 public object Recurrence { get; set; } 14 public int ItemOrder { get; set; } 15 public int Priority { get; set; } 16 public DateTime LastSyncedDateTime { get; set; } 17 public object[] Children { get; set; } 18 public object DueDateTime { get; set; } 19 public DateTime CreatedDate { get; set; } 20 public DateTime? LastCheckedDate { get; set; } 21 public DateTime LastUpdatedDate { get; set; } 22 public bool Deleted { get; set; } 23 public string Notes { get; set; } 24 public bool InHistory { get; set; } 25 public object SyncClientCreationId { get; set; } 26 public bool? DueTimeSpecified { get; set; } 27 public int OwnerId { get; set; } 28 29 30 }

json

1[{"Id":9724830,"Content":"Todo.lyを得る。","ItemType":1,"Checked":false,"ProjectId":3630437,"ParentId":null,"Path":"","Collapsed":false,"DateString":null,"DateStringPriority":0,"DueDate":"","Recurrence":null,"ItemOrder":2,"Priority":4,"LastSyncedDateTime":"\/Date(1481021220171)\/","Children":[],"DueDateTime":null,"CreatedDate":"\/Date(1480751186017)\/","LastCheckedDate":null,"LastUpdatedDate":"\/Date(1480751186017)\/","Deleted":false,"Notes":"","InHistory":false,"SyncClientCreationId":null,"DueTimeSpecified":true,"OwnerId":586638}, 2{"Id":9724803,"Content":"Hover your mouse over a project or item and click the icon on the right side of the item for more options","ItemType":1,"Checked":true,"ProjectId":3630431,"ParentId":null,"Path":"","Collapsed":false,"DateString":null,"DateStringPriority":0,"DueDate":"","Recurrence":null,"ItemOrder":2,"Priority":4,"LastSyncedDateTime":"\/Date(1481021220171)\/","Children":[],"DueDateTime":null,"CreatedDate":"\/Date(1480745247697)\/","LastCheckedDate":"\/Date(1480745574707)\/","LastUpdatedDate":"\/Date(1480745574723)\/","Deleted":false,"Notes":"","InHistory":true,"SyncClientCreationId":null,"DueTimeSpecified":null,"OwnerId":586638}, 3{"Id":9724804,"Content":"Try to drag and reorder items","ItemType":1,"Checked":true,"ProjectId":3630431,"ParentId":null,"Path":"","Collapsed":false,"DateString":null,"DateStringPriority":0,"DueDate":"","Recurrence":null,"ItemOrder":3,"Priority":4,"LastSyncedDateTime":"\/Date(1481021220171)\/","Children":[],"DueDateTime":null,"CreatedDate":"\/Date(1480745247697)\/","LastCheckedDate":"\/Date(1480745579213)\/","LastUpdatedDate":"\/Date(1480745579213)\/","Deleted":false,"Notes":"","InHistory":true,"SyncClientCreationId":null,"DueTimeSpecified":null,"OwnerId":586638}]

###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft Visual Studio Community 2015
Version 14.0.25424.00 Update 3
Microsoft .NET Framework
Version 4.6.01038

インストールしているバージョン:Community

Visual C# 2015 00322-20000-00000-AA575
Microsoft Visual C# 2015

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

あわせて1481021220171はどうやってDateTimeにするものでしょう?

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

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

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

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

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

guest

回答2

0

ベストアンサー

return JsonConvert.DeserializeObject<TodolyClass>(resultString);

取得するものを見る限り、コレクションですよね?

return JsonConvert.DeserializeObject<IEnumerable<TodolyClass>>(resultString);
とかコレクションにしないといかんように見えます。
(どこで何するか次第なので、IEnumerableじゃなくてもListでもいいですが。。。)

1481021220171がTicksならそのままDateTimeにキャストできると思います。ただ、それがUTCの時間なのかどこの時間帯なのかは、TOdo.lyのAPIの仕様を見ましょう♪

投稿2016/12/06 11:28

BEACHSIDE

総合スコア294

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

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

BEACHSIDE

2016/12/06 11:30

あ、どうでもいい情報ですが、TodolyClass って名称は、TodolyModelとかItemModelとかの名称にした方がいいかもですね。で、Listを取得するならTodolyModelsとかって感じで変数名つけるといい感じかもです。
cancat

2016/12/06 13:54

いま、試しました。 取れました。そうか、JSONをParseするときは、IEnumerableとかListで受けないとだめなんでした。そうでしたそうでした。忘れてました。なかなか憶えられないのですが、これで2回目なので、すこしはわかってきました。ありがとうございます。 TicsもNewtonsoft.JsonでするっとParseしてくれました。これは助かりました。UTCなのかどうかは、すこし時間をかけて検証します。まずはこれを表示してみるところで、という感じです。 大感謝。 Class名をModelにする、なるほど。むちゃくちゃナイスなアドバイスです。やっと最近MVVMをちょっとだけ見慣れてきたので、これをModelにしていけばよいんですね!
BEACHSIDE

2016/12/06 14:20

JsonをパースするのにIEnumerableとかするのではなく、受け取るものがコレクションなのか単品なのかって「考える」感じですね。覚える必要はないですよ。 変数とかクラスは責務があって作るものなので、責務にあった名称をつけるって感じですね。そうするとプログラム言語が言語(=言葉)として読めるようになるので。 よいC#ライフを~♪
guest

0

Json.netを使用しているのであれば、Classを作成する必要はありません。

C#

1JObject jo = JObject.Parse(resultString);

UNIXTimeからDatetime

投稿2016/12/06 11:12

mukkun

総合スコア882

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

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

cancat

2016/12/06 13:59

ありがとうございます。 使っているのはjson.netではなく、Newtonsoft.Jsonです。 アドバイス感謝。 Classをつくらなくても、すでにdynamicで受けとれることはわかりました。 ただ、今後書き込みをしたり、更新をしたりするには、たぶんですけど、Classが必要なのではないかなと考えました。なので、Classを用意しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問