Сериализация .NET словарьв объект пары значений ключей JSON - PullRequest
29 голосов
/ 26 февраля 2011

Мне нужно получить:

public class Package
{
    public Package()
    {
        name = "";
        type = new List<Dictionary<string, string>>();
    }

    public string name { get; set; }
    public List<Dictionary<string, string>> type { get; set; }
}

в

{
    "name":"package_name",
    "type":
    {
        "http://random.url.as.key":"random/value"
    }
}

с:

Package package = new Package();
package.name = "package_name";
package.type.Add(new Dictionary<string, string>() { { "http://random.url.as.key", "random/value" } });

Я получаю:

{
    "name":"package_name",
    "type":
    [
        [
            {
                "Key":"http:\/\/random.url.as.key",
                "Value":"random\/value"
            }
        ]
    ]
}

время, с:

var package = new
{
    name = "package_name",
    type = new
    {
        http_random_url_as_key = "random/value"
    }
};

Я получаю:

{
    "name":"package_name",
    "type":
    {
        "http_random_url_as_key":"random/value"
    }
}

Я не могу получить нужное мне http://random.url.as.key. Я пытался использовать JavaScriptSerializer, DataContractJsonSerializer, и Custom Convertor для Json.NET, все с ограниченным успехом / недостатками.

Должен быть лучший способ / что-то, что я пропускаю, чтобы получить простой объект JSON по проводам!

1 Ответ

47 голосов
/ 26 февраля 2011

Ну, во-первых, для первого примера у вас есть список коллекций KeyValuePair<string,string> объектов.

Итак, причина, по которой он преобразуется в показанный JSON, заключается в следующем:

{
    "name":"package_name",
    "type":
    [ // List<Dictionary<string,string>>
        [ // Dictionary<string,string>, a list of KeyValuePair<string,string> objects
            { // KeyValuePair<string,string> object 
                "Key":"http:\/\/random.url.as.key",
                "Value":"random\/value"
            }
        ]
    ]
}

Что касается вашего второго примера, вы создаете динамический объект, содержащий динамический объект, и каждое из полей объекта является тем, что обеспечивает значение ключа.

Итак, я бы предложил обрезать внешний List<> вокруг Dictionary<string,string>, а затем использовать объект Newtonsoft.Json.Converters.KeyValuePairConverter в библиотеке JSON.Net при выполнении сериализации:

string json = JsonConvert.SerializeObject( package, new KeyValuePairConverter( ) );

Надеюсь, это поможет.

EDIT

Ладно, я решил привести более конкретный пример

public class Package
{
    public Package()
    {
        name = "";
        type = new Dictionary<string, string>();
    }

    public string name { get; set; }
    public Dictionary<string, string> type { get; set; }
}

Package package = new Package();
package.name = "package_name";
package.type.Add("http://random.url.as.key", "random/value");
string json = JsonConvert.SerializeObject( package, new KeyValuePairConverter( ) );

Это даст вам вывод

{
    "name":"package_name",
    "type":
    {
        "http://random.url.as.key":"random/value"
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...