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

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

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

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

JSON

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

Q&A

解決済

3回答

689閲覧

Json.NETを使ってConoHaのAPIへネスト化されたJsonを送る方法について

yushistr

総合スコア12

C#

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

JSON

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

0グッド

0クリップ

投稿2017/06/23 13:40

現在、諸事情でConoHaのAPIを使って契約しているオブジェクトストレージにファイルをアップロードするアプリを
C#+WPFで作っています。
そしてJsonのリクエストを送るためにJson.NETを導入したのですが、
Json.NETを使ってネスト化されたJsonを送る方法がイマイチ分からないでいます。
例えば、トークン取得の場合は、

Json

1{ 2 "auth": { 3 "passwordCredentials": { 4 "username": "ConoHa", 5 "password": "paSSword123456#$%" 6 }, 7 "tenantId": "487727e3921d44e3bfe7ebb337bf085e" 8 } 9}

https://www.conoha.jp/docs/identity-post_tokens.html

このようなリクエストを送らなければならないのですが、どうもうまく作れません。
すべて「{}」で囲まなければならないのに「[]」で囲んでしまってBad Requestになったりです。
「Json C# ネスト」などで必死にググったのですがイマイチ解決法が見つかりませんでした。

以下、現在のアプリ側のソースです。
(これも全く機能してません)

class Token { public static void GetToken() { var requestModel = new RequestModel(); var auth = new RequestModel.auth(); var passwordCredentials = new RequestModel.auth.passwordCredentials(); var enc = Encoding.GetEncoding("UTF-8"); var requestURI = string.Format(Define.IdentityEndPoint + "/tokens"); var httpWebRequest = (HttpWebRequest)WebRequest.Create(requestURI); httpWebRequest.Method = "POST"; httpWebRequest.ContentType = "application/json"; using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { passwordCredentials.username = Define.UserName; passwordCredentials.password = Define.Password; string json = JsonConvert.SerializeObject(requestModel); string json1 = JsonConvert.SerializeObject(passwordCredentials); streamWriter.Write(json); MessageBox.Show(json); MessageBox.Show(json1); streamWriter.Flush(); streamWriter.Close(); } //req.Headers.Add(string.Format("Accept: application/json")); var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { MessageBox.Show(streamReader.ReadToEnd()); } } } public class RequestModel { public class auth { public class passwordCredentials { public string username { get; set; } public string password { get; set; } } public string tenantid { get; set; } } }

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

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

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

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

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

guest

回答3

0

クラスの生成が面倒な場合は匿名クラスを利用して書くこともできます。
レスポンスもJObjectまたはdynamicを利用するとクラスを書く必要はありません。
JObjectであればLINQも使用可能です。(dynamicはダメ)
参考までに。

c#

1public JObject GetAccessToken(string username, string password, string tenantId) 2{ 3 var data = new 4 { 5 auth = new 6 { 7 passwordCredentials = new 8 { 9 username = username, 10 password = password, 11 }, 12 tenantId = tenantId 13 } 14 }; 15 16 var response = POST($"{endPoints.IdentityService}/tokens", data); 17 //this.token = response["access"]["token"]["id"].Value<string>() 18 19 return response; 20}

c#

1string response = Post(path, data); 2var obj = JObject.Parse(response); 3 4var data = obj["data"].Value<string>()

投稿2017/06/24 04:04

aglkjggg

総合スコア769

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

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

yushistr

2017/06/24 13:14

回答ありがとうございました。 せっかくの回答で申し訳ないのですが、自分の環境ではエラーでうまく動きませんでした。 最終的にはmsp0310さんの方法で問題解決しました。
aglkjggg

2017/06/24 14:59 編集

Postの部分でエラーが出ているということでしょうか? Postというメソッドはありませんのでご自身で実装願います。 JSON.NETについて参考までにということでした。
yushistr

2017/06/24 15:51

その部分とGetAccessToken()メゾットの宣言自体(CS0116 名前空間にフィールドやメソッドのようなメンバーを直接含めることはできません)に構文エラーが出ていました。 コピペしたのですが、何か貼り付け方を間違ったんでしょうか。
guest

0

VisualStudioの「形式を指定して貼り付け」機能は便利だから使おう。
ネスト化したJSON用のクラスも、JSON文字列から生成してくれるよ。
http://terry-u16.hatenablog.com/entry/2014/03/01/165504

投稿2017/06/23 17:09

kiichi54321

総合スコア1984

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

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

aglkjggg

2017/06/24 03:54

キャメルケースやJsonProperty等のオプションを指定してクラスの生成が可能なこちらのWEBサイトもおすすめです。 https://jsonutils.com/
yushistr

2017/06/24 13:13

回答ありがとうございました。 VSにこんな機能があったのですね・・知りませんでした。 そしてかなり便利でした。
guest

0

ベストアンサー

こんな感じでよろしいでしょうか?
JSONのキーがキャメルケースですが、JSON.NETで共通で出力時にキャメルケースにするオプションも用意されていたと思います。

そのあたりは、以下のリンクを参考にしてください。
https://stackoverflow.com/questions/42994125/how-to-convert-any-pascal-case-json-object-to-camel-case-json-object

csharp

1using Newtonsoft.Json; 2using System; 3using System.Collections.Generic; 4using System.Linq; 5using System.Text; 6using System.Threading.Tasks; 7 8namespace Teratail001 9{ 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 var token = new CocohaGetToken 15 { 16 Auth = new CocohaAuth 17 { 18 PasswordCredential = new PasswordCredential 19 { 20 UserName = "ConoHa", 21 Password = "paSSword123456#$%" 22 } 23 }, 24 TenantId = "487727e3921d44e3bfe7ebb337bf085e" 25 }; 26 27 var json = JsonConvert.SerializeObject(token, Formatting.Indented); 28 Console.WriteLine(json); 29 30 Console.ReadKey(); 31 } 32 } 33 34 public class CocohaGetToken 35 { 36 [JsonProperty("auth")] 37 public CocohaAuth Auth { get; set; } 38 39 [JsonProperty("tenantId")] 40 public string TenantId { get; set; } 41 } 42 43 public class CocohaAuth 44 { 45 [JsonProperty("passwordCredentials")] 46 public PasswordCredential PasswordCredential { get; set; } 47 } 48 49 public class PasswordCredential 50 { 51 [JsonProperty("username")] 52 public string UserName { get; set; } 53 54 [JsonProperty("password")] 55 public string Password { get; set; } 56 57 } 58} 59

json

1{ 2 "auth": { 3 "passwordCredentials": { 4 "username": "ConoHa", 5 "password": "paSSword123456#$%" 6 } 7 }, 8 "tenantId": "487727e3921d44e3bfe7ebb337bf085e" 9}

投稿2017/06/23 14:56

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/06/23 14:59

補足しておきます。 JSONの{}はオブジェクトを表します。 []は配列を表します。 C#の世界ではオブジェクトはクラスです。 配列は、リストや配列などのコレクションです。 それらがJSON.NETを通して出力したときに、変換されます。
yushistr

2017/06/24 13:10

ありがとうございました。msp0310さんとその他の回答してくださった方のおかげで無事以下のコードで正しくJsonリクエストの生成に成功しました。 この方法は今後のAPI操作にも大いに役立つのとJsonの理解も深まったので本当に感謝です。 http://imgur.com/a/8z6d0 (APIユーザー名など公にするとまずそうなものは一応処理してます。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問