🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

JSON

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

2740閲覧

C#から受け取ったJson文字列がparseできない

Izumo_Asa

総合スコア2

C#

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

JSON

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/03/02 17:56

編集2021/03/09 12:26

こんばんは、
.NET FormアプリケーションのWebBrowserコントロールを利用してLeafletを表示させるものを作成しています。
予め入っている緯度経度などの情報が入った配列データを基にマップに経路を表示させる処理を作りたいと思っています。

C#側で作成したJson文字列をWebBrowserコントロールの「WebBrowser.Document.InvokeScript」で引数として渡して処理を実行しようとしたところ、Script側で受け取ることはできたのですが、JSON.parseができなくて困っています。
有識者の方、教えていただければ幸いです。

C#

1public string ConvertSerial() 2 { 3 var cnt = 0; 4 string jsonStr = "" + '['; 5 foreach(var data in SpanDataList_Day1) 6 { 7 JsonConv js = new JsonConv() 8 { 9 Time = data[1], 10 Route = new List<double> 11 { 12 // 緯度 13 double.Parse(data[2]), 14 // 経度 15 double.Parse(data[3]) 16 } 17 }; 18 jsonStr += JsonConvert.SerializeObject(js, Newtonsoft.Json.Formatting.Indented); 19 if (cnt + 1 != SpanDataList_Day1.Count) jsonStr += ','; 20 cnt++; 21 } 22 jsonStr += '];'; 23 return jsonStr; 24 }
jsonStr文字列の中身です [{ "Time": "16:25:00.00", "Route": [ 37.532716, 140.711684 ] }, { "Time": "16:25:00.60", "Route": [ 37.532713, 140.711682 ] }, { "Time": "16:25:1.20", "Route": [ 37.53271, 140.711679 ] }];

C#

1/// <summary> 2 /// Json用格納クラス 3 /// </summary> 4 [JsonObject("SpanData")] 5 class JsonConv 6 { 7 /// <summary> 8 /// 時間 9 /// </summary> 10 [JsonProperty("Time")] 11 public string Time; 12 /// <summary> 13 /// 経路 14 /// </summary> 15 [JsonProperty("Route")] 16 public List<double> Route; 17 }

C#

1JSへの引き渡し 2 3webBrowser1.Document.InvokeScript("PastRoute", new string[] {prbm.ConvertSerial()});

HTML

1<script type="text/javascript"> 2function PastRoute(data) { 3 var js = JSON.parse(data); 4 alert(js); 5} 6</script>

開発環境
VisualStudio 2017
NewtonSoft.Json 12.0.3

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/03/03 10:43

質問者さん、無言になってしまったけど、回答したのでそれに対するフィードバックを書こう。役に立った、立たなかったぐらいは書けるのでは? 役に立たなかったのなら、どこが期待する回答と違ったのか書けばあなたの期待する回答が出てくるかも。
Izumo_Asa

2021/03/08 16:58 編集

すみません、五日間ほど入院しておりました。返事が遅れてしまいました。申し訳ございません。 先ほど家に着き確認してみたところセミコロンが余計でした。
退会済みユーザー

退会済みユーザー

2021/03/08 22:31 編集

> セミコロンが余計でした JSON 文字列を生成する C# のコードでは最後のセミコロンはつかないので、JSON の文字列を書くときの転記ミスだろうと思ってましたが違うのですか?
guest

回答2

0

ベストアンサー

JSONの末尾のセミコロンが余計です。

投稿2021/03/02 23:55

AT_2nd

総合スコア266

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

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

Izumo_Asa

2021/03/08 17:00

返事が大変遅れてしまい、申し訳ございません。 原因はセミコロンが余計でした。ありがとうございました!!!
guest

0

AT_2nd さんが指摘された ; が余計というところは直してもらうとして、以下のようにすれば C# から JavaScript に JSON 文字列渡すことができて、JSON.parse で期待通り JavaScript オブジェクトにパースできるはずです。

注追記: デフォルトでは IE7 相当の動作となるので JSON が定義されてないというスクリプトエラーになるかもしれません。その場合はレジストリの設定で JSON オブジェクトが使えるバージョン以上に設定してください。

WebBrowser コントロールのInternet Explorerを最新のバージョンに変更する
https://www.ipentec.com/document/csharp-change-webbrower-control-internet-explorer-version

WebBrowser アプリ

using System; using System.Windows.Forms; namespace WebBrowser { public partial class Form1 : Form { private string url = "http://websiteproject.com/0090webbrowsertest.aspx"; public Form1() { InitializeComponent(); this.textBox1.Text = this.url; } private void button1_Click(object sender, EventArgs e) { this.webBrowser1.Navigate(this.textBox1.Text); } private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { HtmlDocument document = this.webBrowser1.Document; string json = "[{\"Time\": \"16:25:00.00\",\"Route\": [37.532716,140.711684]}]"; document.InvokeScript("PastRoute", new object[] { json }); } } }

0090webbrowsertest.aspx(上のコードの要求先)

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="0090WebBrowserTest.aspx.cs" Inherits="_0090WebBrowserTest" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <script type="text/javascript"> //<![CDATA[ function PastRoute(data) { var js = JSON.parse(data); alert("Time: " + js[0].Time + " Route: " + js[0].Route[0] + ", " + js[0].Route[1]); } //]]> </script> </head> <body> <form id="form1" runat="server"> <h1>0090WebBrowserTest.aspx</h1> <input id="button4" type="button" value="button" /> </form> </body> </html>

上の WebBrowser の実行結果

イメージ説明

投稿2021/03/03 02:46

編集2021/03/03 03:14
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Izumo_Asa

2021/03/08 17:04

急遽入院により返事が大変遅れてしまいました、大変申し訳ございません。 先ほど帰ってきて確認したところ原因はセミコロンのようで改善することができました。 まだJSONの部分がしっかり理解できていないため、参考にさせていただきます。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2021/03/08 22:41 編集

> 先ほど帰ってきて確認したところ原因はセミコロンのようで 違うのでは? JSON 文字列を生成する C# のコードではセミコロンはつかないです。原因は InvokeScript メソッドへの JSON 文字列の渡し方と JavaScript でパースした後に alert に直接オブジェクトを渡しているところです。
Izumo_Asa

2021/03/09 12:25

今気づきました。「jsonStr += ']';」の部分が、僕の悩んでた当時のコードのほうでは「jsonStr += '];';」になっており、普通に貼る際に何らかのことをして質問文のほうのセミコロンを消してしまったみたいでした。デバッグしたときJson文字列をそのまま貼ったものなので恐らくそうだと思われます。 混乱させるようなことをしてしまい、申し訳ございません。 ここへたどり着いた方が混乱しないためにも質問のほうも悩んでいた当時のものに修正しておきます。
退会済みユーザー

退会済みユーザー

2021/03/09 12:49 編集

でも、InvokeScript("PastRoute", new string[] {prbm.ConvertSerial()}) ではダメだと思うのですが、それで問題なかったですか? また、alert(js) で JSON 文字列を期待通り取得できて表示できるとは思えないの得dすけど?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問