0

JSON 形式で応答が返されます。JSONからフィールドの値を取得するためにjsSerializerを使用しています。ほとんどの部分で機能していますが、ある状況で戻ってくる JSON が\n含まれている理由がわかりません。このため、jsSerializer は機能していません。

これは私のコードです:

 protected void btnStats_Click(object sender, EventArgs e)
    {

        IRestResponse response = GetStats();//Stats provide you with the summary of the events that occur with your messages. 

        JavaScriptSerializer jsSerializer = new JavaScriptSerializer();

        var jsobj = jsSerializer.Deserialize<dynamic>(response.Content);


        int total_count= Convert.ToInt32(jsobj[0]["total_count"]); //I am getting error

これは JSON を返すメソッドです。

    public static IRestResponse GetStats()
    {
        RestClient client = new RestClient();
        client.BaseUrl = "https://api.mailgun.net/v2";
        client.Authenticator =
                new HttpBasicAuthenticator("api",
                                           "key");
        RestRequest request = new RestRequest();
        request.AddParameter("domain",
                             "messenger.test.com", ParameterType.UrlSegment);
        request.Resource = "{domain}/stats";
        request.AddParameter("event", "sent");
        request.AddParameter("event", "opened");
        request.AddParameter("skip", 1);
        request.AddParameter("limit", 2);
        return client.Execute(request);
    }

私は正常に動作しているこれらのメソッドをいくつか持っていますが、私が見つけた唯一の違いは、( response.Content) にある JSON 形式\nです 削除するために何もしていません\n。そこになかっただけです。

これは、そのコードから取得している JSON です。

   "{\n  \"total_count\": 54,\n  \"items\": [\n    {\n      \"total_count\": 715,\n      \"created_at\": \"Mon, 04 Nov 2013 00:00:00 GMT\",\n      \"tags\": {},\n      \"id\": \"5276e3835b8917d8268a6df1\",\n      \"event\": \"opened\"\n    },\n    {\n      \"total_count\": 688,\n      \"created_at\": \"Sun, 03 Nov 2013 00:00:00 GMT\",\n      \"tags\": {},\n      \"id\": \"527592035b8917d8268a1348\",\n      \"event\": \"sent\"\n    }\n  ]\n}"

正常に動作している他の方法では、次のような JSON を取得します。

 "[{\"unique\": {\"link\": 1}, \"total\": 35, \"recipient\": \"cutesycanvas@gmail.com\"}, {\"unique\": {\"link\": 1}, \"total\": 22, \"recipient\": \"angelina40d@hotmail.com\"}]"
4

1 に答える 1

1

書式設定された JSON 文字列には、改行やその他の空白書式を含めることができます。これは\n、Visual Studio デバッガーのように表示されます。

余分な空白なしで JSON 文字列と同じように解析します。

エラーは JSON ではなくコードにあります。動的な値でインデクサーを使用しようとしています。ただし、動的な値は配列ではないため、インデクサーをサポートしていません。オブジェです。次のようなプロパティに手動でアクセスする必要があります。

jsobj["total_count"]

リストした最初の JSON 文字列は、「items」サブ配列を持つオブジェクトです。したがってjsobj["items"][0]、その配列の最初のオブジェクトにアクセスするように書くことができます (少なくとも 1 つのオブジェクトがある場合)。

投稿した 2 番目の JSON 文字列は、オブジェクトにラップされた配列ではなく、単なる配列です。

おそらく、動的ではなく、厳密に型指定されたオブジェクトに逆シリアル化する必要があります。ダイナミックを使用すると、JSON が期待どおりの形式であるかどうかが検証されないため、面倒です。JSON の形式が間違っている場合は、後でではなく、デシリアライズ中にエラーを取得する必要があります。

したがって、次のようなオブジェクトを作成します。

public class SomeResult
{
    public int total_count { get; set; }
    public List<SomeItem> items { get; set; }
}

public class SomeItem
{
    public int total_count { get; set; }
    public DateTime created_at { get; set; }
    ...
}

次に、次のように記述できます。

SomeResult result = serializer.Deserialize<SomeResult>(response.Content);

これで、すべての結果にアクセスできる厳密に型指定されたクラスが作成されました。

名前は正確に作成する必要があり、使用する型は逆シリアル化された型の値と一致する必要があることに注意してください。たとえば、DateTime が null になる可能性がある場合は、DateTime?代わりに null 許容の DateTime ( ) を使用する必要があります。

于 2013-11-04T18:40:01.103 に答える