C #: десериализация примитивов JSON в сложные типы .NET - PullRequest
4 голосов
/ 27 октября 2010

У меня есть файл с именем config.json.Вот его содержание:

{
    dataSources:
    [
        "http://www.blahblah.com/blah",
        "http://www.blahblah.com/blah2",
        ...
    ],

    skills:
    [
        {
            "name": "foobaris",
            "regex": "pattern"
        },
        ...
    ]
}

Я хочу создать объект Config из этих данных настолько легко и лаконично, насколько это возможно.Config определяется как:

public class Config
{
    public IEnumerable<Uri> DataSources { get; set; }
    public IEnumerable<KeyValuePair<string, Regex>> Skills { get; set; }
}

Какой самый простой маршрут?

Поскольку Config.DataSources - это Uri с, а .Skills имеет Regex с, в настоящее время у меня естьчтобы сначала преобразовать (например, RawConfig rawConfig = new JavaScriptSerializer().Deserialize<RawConfig>(configFileContents)) файл конфигурации в эту структуру:

public struct RawConfig
{
    public IEnumerable<string> DataSources { get; set; }
    public IEnumerable<RawConfigSkill> Skills { get; set; }
}

public struct RawConfigSkill
{
    public string Name { get; set; }
    public string Regex { get; set; }
}

... Затем преобразовать эту структуру в Config (например, new Config(rawConfig)).

Могу ли я аннулировать это?

1 Ответ

3 голосов
/ 27 октября 2010

Я вижу этот сценарий довольно часто.

У нас есть некоторые данные, которые необходимо проанализировать из текстового формата, и у нас есть инструменты, которые выполняют для нас анализ, и нам нужен результат в каком-то конкретном объектенаш собственный график.

Такое часто случается с json, с пользовательскими разделами конфигурации приложения, с аргументами командной строки ... просто назвать несколько сценариев.

В этих случаях я личнопредпочитаю держать шаги отдельно.Используйте инструмент / библиотеку (в вашем случае JavaScriptSerializer), чтобы разобрать текст в промежуточный объект.Затем сопоставьте промежуточный объект с вашим конечным объектом (другими словами, с тем, что вы уже делаете).

Попытка выполнить его одним махом обычно делает его более сложным, чем нужно.Инкапсулируйте две операции в одном вызове метода и покончите с ним.

Мы просто согласны с тем фактом, что попытка инструмента синтаксического анализа вывести именно тот график объекта, который нам нужен, почти всегда сопряжена с большими трудностями, чем его ценность.

И, конечно, многое может сделатьэтот второй шаг проще - LINQ для объектов выражений, AutoMapper и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...