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

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

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

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

JSON

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

Q&A

2回答

9529閲覧

C#でurlからjsonを取得して、その値をプログラム内で使いたい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

JSON

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

0グッド

1クリップ

投稿2020/01/25 09:32

編集2020/01/25 09:38

前提・実現したいこと

C#のWindowsフォームアプリケーションで開発中です。
下記urlからjson形式のデータを取得してその値を使いたいのですがその方法がわかりません。
url="https://www.gaitameonline.com/rateaj/getrate"

実現したい動作はformのbuttonがクリックされると、textBoxにインスタンスの値が
渡されて表示されるというものです。

いろんなサイトを見てコードの書き方を調べてみたのですが、urlでjsonを取得して
その値を使う方法が見つけられませんでした。
初歩的な質問で申し訳ありませんがよろしくお願いします。

発生している問題・エラーメッセージ

ビルドエラー、またはデシリアライズがうまくいかずにnullが返ってくる

該当のソースコード

C#

1using Newtonsoft.Json; 2using Newtonsoft.Json.Linq; 3using System; 4using System.Collections.Generic; 5using System.ComponentModel; 6using System.Data; 7using System.Drawing; 8using System.Linq; 9using System.Text; 10using System.Threading.Tasks; 11using System.Windows.Forms; 12using System.Xml; 13using static System.Net.WebRequestMethods; 14using Formatting = Newtonsoft.Json.Formatting; 15 16namespace WindowsFormsApp1 17{ 18 19 20 21 public partial class Form1 : Form 22 { 23 24 25 26 27 public Form1() 28 { 29 InitializeComponent(); 30 } 31 32 private void Form1_Load(object sender, EventArgs e) 33 { 34 35 var fileUrl = @"https://www.gaitameonline.com/rateaj/getrate"; 36 var jObject = JObject.Parse(File.ReadAllText(fileUrl)); //jsonをjobjectにパース 37 38 var pair1 = new List<Pair>();//list型のコレクションインスタンスを作る 39 40 foreach (var property in jObject.Properties())  41 { 42 var pair = property.Value.ToObject<Pair>(); 43 pair.high = property.high; 44 pair1.Add(pair); 45 } 46 47 } 48 49 private void button1_Click(object sender, EventArgs e) 50 { 51 textBox1.AppendText("高値は" + pair1.high + "です"); 52 } 53 } 54 55 // シリアライズの対象となるクラスを宣言 56 public class Pair 57 { 58 59 public int high { get; set; } 60 public int open { get; set; } 61 public int bid { get; set; } 62 public string currencyPairCode { get; set; } 63 public int ask { get; set; } 64 public int low { get; set; } 65 66 } 67}

試したこと

自分で調べた範囲では動作の実現のためにデシリアライズという工程が必要でそれは
urlから取得したjsonデータをJObjectにパース(変換)し、
そのJObjectのプロパティを別にjsonデータに合わせて用意したクラス型のListの
プロパティに代入していく・・・という流れだと大まかに理解しましたが
その理解であっているのか自信がありません。

以下の部分がエラーになりますが、修正の仕方がわかりませんでした。

var jObject = JObject.Parse(File.ReadAllText(fileUrl));

pair.high = property.high;

textBox1.AppendText("高値は" + pair1.high + "です");

補足情報(FW/ツールのバージョンなど)

VisualStudio2017()Microsoft Visual Studio Community 2017
Version 15.9.19

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

urlから取得したjsonデータ

この工程がまるっと抜けてます。
メソッドを書いてあげましょう。

C#

1string DownloadString(string url) 2{ 3 using (var webClient = new System.Net.WebClient()) 4 { 5 return webClient.DownloadString(url); 6 } 7}

投稿2020/01/25 10:01

hihijiji

総合スコア4150

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

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

退会済みユーザー

退会済みユーザー

2020/01/26 03:39 編集

回答ありがとうございます。コードを参考に以下のように修正を行ってみましたが、 メソッドを上手く配置できずにjsonデータを取得できませんでした。 string url2 = System.IO.File.ReadAllText(url1);の部分でurl1に現在のコンテキストで~という エラーが出ているのでスコープ関連なのかと思いいろいろ直してみましたが、うまく配置できずに 詰まってしまいました。 上記メソッドは質問コードのどの場所にどのように配置するべきなのでしょうか? 初歩的な質問で申し訳ありませんがよろしくお願いします。 (変更していないusing部分は省略) namespace WindowsFormsApp1 { class DownloadString { string url = @"https://www.gaitameonline.com/rateaj/getrate"; string DownloadString(string url) { using (var webClient = new System.Net.WebClient()) { string url1 = webClient.DownloadString(url); return url1; } } } public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { string url2 = System.IO.File.ReadAllText(url1); var jObject = JObject.Parse(url2); //jsonをjobjectにパース var pair1 = new List<Pair>();//list型のコレクションインスタンスを作る foreach (var property in jObject.Properties()) { var pair = property.Value.ToObject<Pair>(); pair.high = property.high; pair1.Add(pair); } } private void button1_Click(object sender, EventArgs e) { textBox1.AppendText("高値は" + pair1.high + "です"); } } // シリアライズの対象となるクラスを宣言 public class Pair { public int high { get; set; } public int open { get; set; } public int bid { get; set; } public string currencyPairCode { get; set; } public int ask { get; set; } public int low { get; set; } } }
hihijiji

2020/01/27 01:15

DownloadStringはJSONのテキストをダウンロードするメソッドです。 System.IO.File.ReadAllTextはローカルファイルを開くメソッドです。 Webサーバ、HTTP、JSON、FileStream がそれぞれ何であるのか根本的にわかってないみたいですね。 Webサーバ 入門 HTTP 入門 JSON 入門 C# FileStream これらをググってヒットするサイトをそれぞれ10カ所づつ目を通してください。 それで理解できなければもう10カ所づつ目を通してください。
退会済みユーザー

退会済みユーザー

2020/01/27 01:45

webサーバーにhttpという手順でjosn形式のファイルを要求してるということですよね?それでダウンロードしてきたファイルを読み取るのがFileStreamということまでは理解しています。 ただ理解はしているのですが、それをコード上で表現する時に詰まってしまっていました。 まだ今回の詰まっている部分を解決するに当たって自分の必要なメソッドやコードの書き方をよく把握できてないのでその辺りについて上記回答を参考にして調べてみようと思います。 回答ありがとうございました。
退会済みユーザー

退会済みユーザー

2020/01/27 02:09

json形式(データフォーマット)で、それをstring(文字列)として取ってきてそれを読み取るのがFileStreamだという理解で宜しいでしょうか?
hihijiji

2020/01/27 02:22

全然違います。 今の段階でコードを書いてもまず動きませんし、動いても貴方のためになりません。 繰り返します。 Webサーバ 入門 HTTP 入門 JSON 入門 C# FileStream これらをググってヒットするサイトをそれぞれ10カ所づつ目を通してください。 それで理解できなければもう10カ所づつ目を通してください。
退会済みユーザー

退会済みユーザー

2020/01/27 02:35

了解しました。考え方が根本的にズレてしまっているということなので上記のサイトを一通り調べた上で考え直してみたいと思います。 少し時間がかかりそうですが、今日明日中にはこなせると思います。
退会済みユーザー

退会済みユーザー

2020/01/27 09:04

Webサーバー=静的動的コンテンツをクライアントの要求に応じて返すコンピューター、またはプログラム HTTP=ネットワークプロトコル(通信規約)の一種で、クライアントとサーバー間でコンテンツをやり取りする方法を決めたもの JSON=Javascriptをベースとして作られているオブジェクトのデータ構造で、異なるプログラム間のデータ受け渡しができる。keyとvalueのペアを持つKVSの1つで人間への可動性を残している。 C#FileStream=Streamクラスから派生したバイト配列を読み書きをサポートするクラス。(ストリームとはデータの流れであり、ファイル以外にもメモリやデータのやり取りも扱える。) 以上の理解でよろしいでしょうか? そして間違いを指摘された部分に関してですが、 「サーバーにクライアントからHTTPリクエストを送ってHTTPレスポンスでクライアント上に返ってきたJSONという形式のデータをC#で扱えるようにFileStreamでデシリアライズする」 という理解でよろしいでしょうか? 以下参考にさせてもらったサイト Webサーバー (https://eng-entrance.com/web-server-mechanism) 今更聞けない!Webサーバーの仕組みと構築方法 (https://qiita.com/_MiKe_/items/c2988ec70554ccb9529a) 初心者による初心者の為のWebサーバ解説 (https://kitsune.blog/web-server-summary) Webサーバとは?仕組みや種類を初心者にもわかりやすく解説 (https://nandemo-nobiru.com/web-5118/) Webサーバーとは何か?ウェブサイト運営者に必要な基礎知識 (http://kmaebashi.com/programmer/webserver/webserver.html) Webサーバを作る (https://www.atmarkit.co.jp/ait/articles/0101/16/news003.html) Webの仕組みとWebサーバの構造 (https://ja.wikipedia.org/wiki/)  Wiki (http://ossforum.jp/node/564)  I-9-6. Webサーバのしくみ (https://qiita.com/geshi/items/93319262be1fb68a756a) WEBサーバーの仕組み (https://www.jtp.co.jp/techport/2017-02-08-002/) Webサーバはどのように動いているのだろう?~HTTP・URL・クッキー編~ HTTP (https://www.nic.ad.jp/ja/basics/terms/http.html)>インターネット用語1分解説>>HTTPとは (https://wa3.i-3-i.info/word165.html) 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 (http://e-words.jp/w/HTTP.html) IT用語辞典 (https://www.atmarkit.co.jp/ait/articles/1703/29/news045.html) 第1回 HTTPプロトコルとは (https://ja.wikipedia.org/wiki/Hypertext_Transfer_Protocol) wiki (https://note.com/toyomomo/n/nef357f75374b) 【超ざっくり解説シリーズ1】HTTP通信についてわかりやすく解説するよ (https://ferret-plus.com/4503) 【知っておきたい】httpとhttpsの違いと推奨される設定とは (https://kotobank.jp/word/HTTP-1260) HTTP(読み)エイチ ティー ティー ピー (https://www.yamanjo.net/knowledge/internet/internet_08.html) WWWを支えるプロトコル ~ HTTPとは ~ (https://www.infraexpert.com/study/tcpip16.html) TCP/IP - HTTPとは - ネットワークエンジニアとして JSON (https://www.json.org/json-ja.html)  JSON の紹介 (https://ja.wikipedia.org/wiki/JavaScript_Object_Notation) wiki (https://milkcocoa.info/2019/03/03/http-req-json-res/) 【C#】HTTPリクエスト→JSONレスポンス (https://thinkit.co.jp/article/70/1)JSONってなにもの? (https://www.sejuku.net/blog/80617)JSONの形式を完全理解して読み書きできるようになるための記事 (http://www.tohoho-web.com/ex/json.html) JSON入門>>JSONとは (https://dev.classmethod.jp/etc/concrete-example-of-json/)非エンジニアに贈る「具体例でさらっと学ぶJSON」 (https://qiita.com/dain/items/02441195e889a9c9f140)JSONってそもそもなに? (https://www.magellanic-clouds.com/blocks/guide/what-is-json/) JSONとは何か | MAGELLAN BLOCKS (https://wa3.i-3-i.info/word13798.html)「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典>>JSON C# FileStream (https://www.atmarkit.co.jp/fdotnet/csharptips/005file/005file.html) C#プログラミングTipsファイル入出力の基礎 (https://docs.microsoft.com/ja-jp/dotnet/api/system.io.filestream?view=netframework-4.8) FileStreamクラス (https://programming.pc-note.net/csharp/filestream.html) FileStreamクラスストリームを利用したファイルの読み書き (https://www.weblio.jp/content/FileStream)  FileStream クラスとは何? (https://smdn.jp/programming/netfx/stream/1_1_filestream/) ストリーム>>FileStreamクラス (https://araramistudio.jimdo.com/2018/12/06/) cでバイナリファイルを読み込む (https://tamajiro.net/vb/) filestreamクラス (http://light11.hatenadiary.com/entry/2019/06/29/152002) 【C#】C#でファイルを読み書きする方法まとめ (http://zetcode.com/csharp/filestream/) C# FileStream tutorial (http://okwakatta.net/topic/topic054.html) そのファイルオープン大丈夫ですか? - 猫の気ままなC#日記
退会済みユーザー

退会済みユーザー

2020/01/27 09:43

stringですよね?そのサイトはすでに拝見しました。 取得するといった部分の細かい言葉の定義について指摘されているのでしょうか?
hihijiji

2020/01/27 09:48

string が返ってきているのにFileStreamで何をするのですか?
退会済みユーザー

退会済みユーザー

2020/01/27 10:03 編集

すいません、一情報を検索して自分なりに理解したつもりですがFileStreamについての 理解が浅かったようです。 FileStreamではstringではなくバイト配列しか扱えないんですね。 それ以外の流れについてまた指摘があればお願いします。
hihijiji

2020/01/27 10:04

冷蔵庫(Webサーバ)にプリン(JSON)があります。 貴方はプリン(JSON)を取り出して(ダウンロードして)食べたい(利用したい)。 貴方はなぜか自分のポケット(ローカルファイル)から出そうと(FileStream)している。←いまここ
退会済みユーザー

退会済みユーザー

2020/01/27 11:33

意味がよくわからないです。しかし無駄にやりとりが長くなるのは本意ではないので十分です。 回答ありがとうございました。
guest

0

jsonの外側の部分("quotes")も作れば、JsonConvert.DeserializeObject一発でデシリアライズできます。

Listと個々のPairがごっちゃになっているようです。
ローカル変数(var pair1)はメソッドを抜けたら消えてしまいます。

cs

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Windows.Forms; 5using Newtonsoft.Json; 6 7namespace Questions237472 8{ 9 public partial class Form1 : Form 10 { 11 private List<Pair> pairs; 12 13 public Form1() 14 { 15 InitializeComponent(); 16 button1.Text = "USD/JPY"; 17 } 18 19 private void Form1_Load(object sender, EventArgs e) 20 { 21 var fileUrl = @"https://www.gaitameonline.com/rateaj/getrate"; 22 var root = JsonConvert.DeserializeObject<Root>(DownloadString(fileUrl)); 23 pairs = root.quotes; 24 } 25 26 private void button1_Click(object sender, EventArgs e) 27 { 28 var pair1 = pairs.First(x => x.currencyPairCode == "USDJPY"); 29 textBox1.AppendText("高値は" + pair1.high + "です"); 30 } 31 32 private string DownloadString(string url) 33 { 34 using(var webClient = new System.Net.WebClient()) 35 { 36 return webClient.DownloadString(url); 37 } 38 } 39 40 private class Root 41 { 42 public List<Pair> quotes { get; set; } 43 } 44 45 private class Pair 46 { 47 public double high { get; set; } 48 public double open { get; set; } 49 public double bid { get; set; } 50 public string currencyPairCode { get; set; } 51 public double ask { get; set; } 52 public double low { get; set; } 53 } 54 } 55}

投稿2020/01/27 09:55

編集2023/07/18 21:49
TN8001

総合スコア9317

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問