2010-10-27 2 views
4

У меня есть файл с именем config.json. Вот его содержание:C#: десериализация примитивов JSON в .NET сложные типы

{ 
    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 s и .Skills имеет Regex с, я в настоящее время приходится derserialize (т.е. 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)).

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

ответ

3

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

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

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

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

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

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

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

Смежные вопросы