92166


提示コードですが参考サイトAを参考にリクエストで帰ってくる値を取得したいのですが.jsonの取得が上手く行えません、これはなぜでしょうか？`client_name`パラメータもweb上で作成したものと同じものを入力しています。

##### 発生している例外

[code]

    JsonReaderException: Unexpected character encountered while parsing value: <. Path '', line 0, position 0.
    
[/code]

##### 行ったこと

`//Console.WriteLine(res);`によるhtml表示が成功していますが  
json表示させようとうすると例外が発生します。

##### 知りたいこと

##### 参考サイト

A: <https://docs.joinmastodon.org/methods/apps/>  
B: <https://qiita.com/rawr/items/f78a3830d894042f891b>

[code]

    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net.Http;
    using System.Runtime.CompilerServices;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Json;
    using System.Security.Cryptography;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace test4
    {
        internal class Program
        {
            static Dictionary<string, string> parameters = new Dictionary<string, string>()
            {
                { "client_name", "test" },
                { "redirect_uris", "urn:ietf:wg:oauth:2.0:oob" }
            };
    
            private static async Task f()
            {
                System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
                client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko");
    
                //var t = client.GetAsync($"https://mstdn.jp/api/v1/apps?{await new FormUrlEncodedContent(parameters).ReadAsStringAsync()}").Result;
                var t = client.GetAsync($"https://mstdn.jp/api/v1/apps{await new FormUrlEncodedContent(parameters).ReadAsStringAsync()}").Result;
    
                var res = t.Content.ReadAsStringAsync().Result;
                dynamic json = Newtonsoft.Json.JsonConvert.DeserializeObject(res);
    
    
                //Console.WriteLine(res);
                Console.WriteLine(json);
    
    
    
            }
    
            private static async void t()
            {
                Task.WaitAll(f());
            }
    
    
            static void Main(string[] args)
            {
                t();
                
    
                Console.ReadKey();
            }
        }
    }
    
    
[/code]


CC BY-SA 4.0
2022-11-11T07:38:14.187
92151
2022-11-12T01:03:19.813
2022-11-11T11:40:27.077
55177
55177
question
c#
C# http リクエストを取得できない原因が知りたい


> > `Newtonsoft.Json.JsonConvert.DeserializeObject("<html> ～ </html>");`
> とやると例外が発生するという質問でしょうか？
>
> はい、そうです。

htmlはhtmlであり、jsonではないため、`JsonConvert.DeserializeObject()`にhtmlを渡した場合はほぼ例外が発生します。極まれに例外が発生しないこともあるでしょうが、それでも期待した結果は得られないはずです。

一応、 <https://json.org/> などを参照するとわかりますが、JSONは

  * `{` （オブジェクトの開始を表す）
  * `[` （配列の開始を表す）
  * `"` （文字列の開始を表す）
  * `0`～`9` （数値の先頭）
  * `-` （マイナス符号）
  * `t` （`true`の先頭文字）
  * `f` （`false`の先頭文字）
  * `n` （`null`の先頭文字）

のいずれかで開始されます。それに対して例外メッセージに

> JsonReaderException: Unexpected character encountered while parsing value:
> <. Path '', line 0, position 0.

とあるように先頭文字が `<` であったためにJSONとしては解析できない、となります。

* * *

言うまでもないかもしれませんが、`JsonConvert.DeserializeObject()`はJSON文字列が入力されることを想定していますので、JSON文字列を渡すようにしてください。

* * *

> Aサイトのようなjsonを取得するにはどうしたらいいのでしょうか？

本件は解決済みとして改めて質問し直してください。その際、解決したいこと、回答者に答えて欲しいことをよく考えて質問文を推敲してください。

少なくとも本スレッドで質問者さんは

> > htmlが何でjsonが何なのかは理解されていますか？
>
> htmlはwebページでjsonは書式です。一応調べたことなので書きました。

と答え、htmlとjsonの違いを認識したうえで、

> `//Console.WriteLine(res);`によるhtml表示が成功しています

とhtmlが得られたことを「成功」と表現し、暗に「jsonを取得する」ことは目的としていないとされています。

繰り返しになりますが、`JsonConvert.DeserializeObject()`の動作は解決したい問題と何ら関係なく、変数`res`にjsonでなくhtmlが格納されてしまう、サーバーからそのような応答が返されてしまうことが問題なのではありませんか？
そうであれば、そう尋ねるべきです。

  * [良い質問をするには？](https://ja.stackoverflow.com/help/how-to-ask)
  * [再現可能な短いサンプルコードの書き方](https://ja.stackoverflow.com/help/minimal-reproducible-example)

も参考にしてください。


CC BY-SA 4.0
2022-11-11T12:41:55.867
92166
2022-11-12T01:03:19.813
2022-11-12T01:03:19.813
4236
4236
92151
answer