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

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

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

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

JSON

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

3回答

2094閲覧

出力されたjsonっぽい文字列をjsonとして扱えない

kohehe

総合スコア13

C#

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

JSON

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/08/25 00:32

編集2020/08/25 02:42

前提・実現したいこと

Watsonから出力されるjsonであろう文字列
response.Rresponse =
{"document_tone":{"tones":[{"score":1.0,"tone_id":"sadness","tone_name":"Sadness"}]}}

これを
a = response.Response.document_tone.tones
print("a= " + a);
//出力
a= {"score":1.0,"tone_id":"sadness","tone_name":"Sadness"}
の様に、jsonっぽく扱いたい

追記
scoreの値のみほしいとします。
a = response.Response.document_tone.tones.score
print("a= " + a);
とすれば、
//出力
a= 1.0
と出したい

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

response.Response.document_tone.tonesと打っても、そんなのはないとエラーが出ます。
response.Responseここからただの文字列的扱いしかできない状況

該当のソースコード

private void OnTone(DetailedResponse<ToneAnalysis> response, IBMError error)
{

string respo = response.Response;//←jsonじゃない? if (error != null) { Log.Debug("ExampleToneAnalyzerV3.OnTone()", "Error: {0}: {1}", error.StatusCode, error.ErrorMessage); } else { Log.Debug("ExampleToneAnalyzerV3.OnTone()", "{0}", response.Response);

       }

}

試したこと

このサイトより

string str = "{ 'context_name': { 'lower_bound': 'value', 'pper_bound': 'value', 'values': [ 'value1', 'valueN' ] } }";
JavaScriptSerializer j = new JavaScriptSerializer();
object a = j.Deserialize(str, typeof(object));
という感じでjson文字列をjsonにしまっせ言っていたのでやってみましたが、JavaScriptSerializerがないんで無理と、無いならそのクラス作りますか?とお達しがありましたが、それ意味なくない?と思い断念

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/08/25 02:23

> の様に、jsonっぽく扱いたい それの何が JSON ぽく扱っているのか意味不明なんですけど? そもそも何がしたいのですかね? JSON 文字列を C# のオブジェクトにデシリアライズして C# のコードで扱いたい? 違うかなぁ・・・
kohehe

2020/08/25 02:38

まず、Watsonが出力する形式が {"document_tone":{"tones":[{"score":1.0,"tone_id":"sadness","tone_name":"Sadness"}]}} と、このようになっているので 「これはjsonの形で出力しているのだろう」 と判断しました。 次に、それがjsonとして扱えるのなら、階層ごとに???.!!!という風にして取得が可能だろうと判断しました。例えば上記出力結果のscoreだけを取得したい時に便利ですよね。 しかし、response.Response.~という風にしても取得ができません。自分のjsonに対する解釈が間違っているのかとも思い、このteratailに質問をさせて頂きました。 確かに上の質問の目的を明記すべきでした。指摘ありがとうございます。
退会済みユーザー

退会済みユーザー

2020/08/25 02:53 編集

上の私のコメントの質問、 JSON 文字列を C# のオブジェクトにデシリアライズして C# のコードで扱いたい? に答えてもらえませんか? それであれば、以下の記事のようにしてデシリアライズされた結果の C# のクラス定義が分かりますので、それをもとにデシリアライスすればよさそうですが。 JSON 文字列から C# のクラス定義生成 http://surferonwww.info/BlogEngine/post/2020/05/10/generate-class-definition-from-json-string.aspx デシリアライザは、JavaScriptSerializer が使えなければ、Nuget から Newtonsoft.NET とか MiniJSON とかを入手して何とでもできるのでは?
YAmaGNZ

2020/08/25 03:01

多分、JSONの解釈を間違えているのではないかと思います。 JSONとはあくまで「文字列」です。 まずはJSONについて調べることをお勧めします。
kohehe

2020/08/25 03:03

JSONって文字列なのですか、また別の形式の何かだと思っていました。調べてみます。
YAmaGNZ

2020/08/25 03:13

簡単に言うと、データの構造やデータの内容を記載した文字列です。 これをプログラムが扱えるように変換する必要があります。 その変換方法についてsakura_hanaさんやSurferOnWwwさんがコメントされています。
退会済みユーザー

退会済みユーザー

2020/08/25 03:38 編集

> JSONって文字列なのですか そうです。JavaScript Object Notation と言って、もともとは JavaScript のオブジェクトをシリアライズして文字列にしたものです。 JSON の紹介 http://www.json.org/json-ja.html
guest

回答3

0

ベストアンサー

質問の 2020/08/25 11:52 のコメントで書いたことですが・・・

JSON 文字列を C# のオブジェクトにデシリアライズして C# のコードで扱いたいということであれば、以下の記事のようにしてデシリアライズされた結果の C# のクラス定義が分かりますので、それをもとにデシリアライスすればよさそうです。

JSON 文字列から C# のクラス定義生成
http://surferonwww.info/BlogEngine/post/2020/05/10/generate-class-definition-from-json-string.aspx

デシリアライザは、JavaScriptSerializer が使えなければ、Nuget から Newtonsoft.Json を入手して使えばよさそうです。

hidori さんの回答への fiveHundred さんのコメントでは使えないとのことですが(使えるという記事もググるとヒットしますが・・・)、もしそうであれば、MiniJSON のソースをダウンロードして使うとかとかして何とでもできるのでは?

上に紹介した記事のようにして C# のクラス定義を生成すると以下のようになります。

public class Rootobject { public Document_Tone document_tone { get; set; } } public class Document_Tone { public Tone[] tones { get; set; } } public class Tone { public float score { get; set; } public string tone_id { get; set; } public string tone_name { get; set; } }

上のクラス定義を使って Newtonsoft.Json でデシリアライズすると以下のようになります。ローカル変数 newtonsoft がその結果です。

ローカル変数 miniJson の方は MiniJSON を使ったデシリアライズ結果(こちらは Dictionary<string, object> 型になります)です。

イメージ説明

投稿2020/08/25 04:46

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kohehe

2020/08/25 06:29

わざわざありがとうございます。 SurferOnWwwさんの上記のクラス定義をした上で     public Rootobject root; root = JsonUtility.FromJson<Rootobject>(response.Response); string resp = JsonUtility.ToJson(root.document_tone); Debug.Log(resp); としたのですが、何も出力されませんでした。 それと string resp = JsonUtility.ToJson(root.document_tone.tones[2]); として、tones内の特定のobjectだけを抽出しようとすると NullReferenceException: Object reference not set to an instance of an object このようなエラーが出ました。
退会済みユーザー

退会済みユーザー

2020/08/25 07:01

自分は質問のコメントでも上の回答でも JsonUtility とかを使う話は一切してませんけど? Newtonsoft.Json または MiniJson を使う話をしているのですが? 結局、一体何を聞きたいのですか?
kohehe

2020/08/25 07:19

結局のところ、 Watsonが出力するjson文字列からscoreの数値のみ抜き出し、それをプログラムに利用したいということです。 Newtonsoft.Jsonの使い方がいまいちよく分からなかったので、調べたら出てきたJsonUtilityを使ってみました。 文脈的におかしくなってしまいましたねすみません
guest

0

using Newtonsoft.Json; [System.Serializable] public class Rootobject { public Document_Tone document_tone { get; set; } } [System.Serializable] public class Document_Tone { public Tone[] tones { get; set; } } [System.Serializable] public class Tone { public float score { get; set; } public string tone_id { get; set; } public string tone_name { get; set; } } //略 private void OnTone(DetailedResponse<ToneAnalysis> response, IBMError error) {     Rootobject root = JsonConvert.DeserializeObject<Rootobject>(response.Response);    string ab = "" + root.document_tone.tones[0].tone_name; Debug.Log(ab);//←コレ if (error != null) { Log.Debug("ExampleToneAnalyzerV3.OnTone()", "Error: {0}: {1}", error.StatusCode, error.ErrorMessage); } else { Log.Debug("ExampleToneAnalyzerV3.OnTone()", "{0}", response.Response); } }

こうして、悲しい系の入力をしたら、コレの出力が
"sadness"
と出力されました。

皆さんありがとうございます。
特にSurferOnWwwさん、ありがとうございます。

投稿2020/08/25 07:36

kohehe

総合スコア13

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

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

退会済みユーザー

退会済みユーザー

2020/08/25 08:12

それって 99% ぐらいは私の回答ですよ。ベストアンサー付ける場所間違ってませんか?
kohehe

2020/08/25 08:18

すみませんミスりました
guest

0

JavaScriptSerializerがないんで無理

プロジェクトに Newtonsoft.Json パッケージを追加してください。
この辺が参考になると思います。

投稿2020/08/25 03:18

hidori

総合スコア403

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

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

fiveHundred

2020/08/25 03:28

これもネイティブC#の話なので、これではUnityでは使えないですね。
Zuishin

2020/08/25 04:53

Unity で使えないのはなぜですか?
Zuishin

2020/08/25 05:02

聞いた後でなんですが、Nuget で入手したパッケージがそのままでは出力フォルダーに出力されないという意味なのかなと思いました。パブリッシュする方法はいくつかあるようですが、確かに一手間要りますね。
fiveHundred

2020/08/25 05:43

Unityで使用する場合、DLLを直接Assetsディレクトリ以下に入れるのが通常のやり方です。 .nupkgファイルの場合は、以下のように解凍して中身のDLLを取り出す形になります。 https://qiita.com/jhorikawa_err/items/f75539ffe6cd7a360f65 別の方法として、NuGetForUnityを使う方法もあるそうです(あまり使ったことないので私はよく分かりませんが)。 https://github.com/GlitchEnzo/NuGetForUnity UnityにおけるVisual Studioはあくまでエディタ兼デバッガで、設定を行う場合は上記のようにUnityから行うことになります。 なので、Visual Studioから設定を変更しても、基本的にはUnityの設定は変更されないので、動作しないことがほとんどです。 (ただ、私の知らないうちに状況が変わっている可能性はもちろんありますが)
Zuishin

2020/08/25 06:00 編集

ありがとうございます。 しかし「ネイティブな C# で使えない」という表現は語弊を招く(まるで Unity の C# が通常のものと違うように見えるし、Newtonsoft.Json が Unity で使えないように見える)ので、次回からは、「Unity は NuGet に対応していないので別の方法でインストールするか、dll を Unity に合わせてパブリッシュしなければならない」などのように表現してもらえばと思います。実際、そこを誤解している人は多いように思います。
fiveHundred

2020/08/25 06:26

失礼しました。今後は表現には気を付けます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問