0

我收到 JSON 格式的回复。我正在使用 jsSerializer 从 JSON 中获取字段的值。它大部分都在工作,但我不确定为什么在一种情况下返回的 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]访问该数组中的第一个对象(如果至少有一个对象)。

您发布的第二个 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,则必须改用可为 null 的 DateTime ( DateTime?)。

于 2013-11-04T18:40:01.103 回答