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

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

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

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

JSON

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

Q&A

解決済

1回答

1641閲覧

C# json受け取り

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

JSON

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

0グッド

0クリップ

投稿2020/10/13 08:20

環境
windows 10
visual studio 2019
C# .Net core 3.1

困っていること
Newtonsoft.Jsonを使用し、4種類classを作ってjsonパースをしているのですが
jsonファイルを4種類取得しているため異なるjson形式だとSystem.NullReferenceExceptionエラーが発生します。

現在はの対応はtry catchでSystem.NullReferenceExceptionのエラーが発生した場合次へ、次へとパースをしているのですが
この対策は危険だと思うので対策をしたいのですが、どのようにすればいいでしょうか?

現在の対策

test.cs

1try{ 2var status = JsonConvert.DeserializeObject<getstatus>(receivedjson); 3 string statusstr = status.subscriber.status; 4} 5catch(System.NullReferenceException){ 6 try{ 7 8 var logs = JsonConvert.DeserializeObject<getlogs>(receivedjson); 9 string logsstr = logs.subscriber.logs; 10 11 12 13 } 14 catch(System.NullReferenceException){ 15 try{ 16 var main = JsonConvert.DeserializeObject<getmain>(receivedjson); 17 string mainstr = main.main; 18 19 } 20 catch(System.NullReferenceException){ 21 } 22 } 23 24 25}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/10/13 09:06 編集

質問者さん、初心者の方ですか? であれば、初心者マークを付けましょう。 質問のコードは何かメチャクチャというか、少なくとも私の想像の斜め上を行っている感じです。null になる可能性があるものが分かっているなら、それが null か否か調べて処置できるのでは? それなのに、 catch(System.NullReferenceException) というようなコードを書くのは全く間違ってます。
guest

回答1

0

ベストアンサー

現在はの対応はtry catchでSystem.NullReferenceExceptionのエラーが発生した場合次へ、次へとパースをしているのですがこの対策は危険だと思うので対策をしたいのですが、どのようにすればいいでしょうか?

特に「危険」ということはなさそうですが、質問のコードのような、例外を発生させてそれを catch して処理を行うようなコードは避けるべきです。

例外を発生させる以外方法がなければともかく、質問のケースでは null になる可能性があるものが分かっているはずで、そこが null か否か調べて次の処置につなげることができるはずです。

以下のドキュメントの Newtonsoft.Json のメソッドを使っているようですが、

JsonConvert.DeserializeObject<T> Method (String)
https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_JsonConvert_DeserializeObject__1.htm

であれば、引数の JSON 文字列が指定した T 型のオブジェクトにパースできない場合は、例えば、質問者さんのコード

var status = JsonConvert.DeserializeObject<getstatus>(receivedjson); string statusstr = status.subscriber.status;

の status.subscriber が null となるはずなので、それをチェックして次の処理に進めることができるのでは?

var status = JsonConvert.DeserializeObject<getstatus>(receivedjson); if (status.subscriber == null) { // 次の処置 }

もしくは事前に JSON 文字列から T の型を判定して対処するとか。

投稿2020/10/14 04:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/10/14 06:11

親切な回答ありがとうございます。 毎回if(status.subscriber.status == null)としていたためエラーが出てしまっていましたが、nullも判定もできなく困っていましたが、 if(status.subscriber == null || status.subscriber.status == null)とすることで解決しました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問