Сериализуйте строку запроса как Json в C # - значения не отображаются, только ключи.Зачем? - PullRequest
4 голосов
/ 19 сентября 2011

Я пытаюсь сериализовать строку запроса в JSON в C #.Я не получаю ожидаемых результатов и надеюсь, что кто-нибудь сможет объяснить.Почему-то я получаю только запрос «имя», а не «значение».

   //Sample Query:
   http://www.mydomain.com/Handler.ashx?method=preview&appid=1234      


    //Generic handler code:
    public void ProcessRequest(HttpContext context)
    {
        string json = JsonConvert.SerializeObject(context.Request.QueryString);
        context.Response.ContentType = "text/plain";
        context.Response.Write(json);
    }

    //Returns something like this:
    ["method", "appid"]

    //I would expect to get something like this:
    ["method":"preview", "appid":"1234"]

Кто-нибудь знает, как получить строку, похожую на последний пример вывода?Я также попробовал

string json = new JavaScriptSerializer().Serialize(context.Request.QueryString);

и получил те же результаты, что и Newtonsoft Json.

EDIT. Вот окончательный рабочий код, основанный на ответе ниже:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Script.Serialization;
using Newtonsoft.Json;
using System.Collections.Specialized;

namespace MotoAPI3
{

public class Json : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        var dict = new Dictionary<string, string>();
        foreach (string key in context.Request.QueryString.Keys)
        {
            dict.Add(key, context.Request.QueryString[key]);
        }

        string json = new JavaScriptSerializer().Serialize(dict);
        context.Response.ContentType = "text/plain";
        context.Response.Write(json);
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

Ответы [ 2 ]

4 голосов
/ 20 ноября 2013

Это оценивается как Dictionary<string,string>, который легко сериализуется с помощью JavaScriptSerializer или Newtonoft's Json.Net:

.
Request.QueryString.AllKeys.ToDictionary(k => k, k => Request.QueryString[k])

Любые повторяющиеся ключи в Request.QueryString заканчиваются как один ключ в словаре, значения которого объединяются вместе через запятую.

Конечно, это также работает для любого NameValueCollection, а не только Request.QueryString.

4 голосов
/ 19 сентября 2011

Ну, строка запроса - это NameValueCollection, и как сериализовать NameValueCollection здесь: как преобразовать NameValueCollection в строку JSON?

...