public static void Main()
string jsonData = "{\"AccountId\":\"e647a62f-43ba-4bad-b6f9-dce5a82398eb\",\"CalendarServiceId\":\"9e8694a7-2e30-4938-a09d-027104270d4f\",\"Name\":\"Default\",\"DefaultSetting\":true,\"ActiveOn\":31,\"ActiveFrom\":\"2019-06-13T09:00:00\",\"ActiveTo\":\"2019-06-13T17:30:00\",\"BookingPolicy\":3,\"LogInNeededToBook\":true,\"LogInNeededToStart\":false,\"LogInNeededToEnd\":true,\"LogInNeededToExtend\":true,\"LogInNeededToDelete\":true,\"DeletingPolicy\":\"LogInNeededToDelete\",\"AskToStartMeetingOnScreen\":true,\"AskToStartMeetingOnScreenBeforeMin\":5,\"CanCancelMeetingIfNotStarted\":false,\"WaitingTimeBeforeCancelMeeting\":0,\"CanReceiveExtendNotification\":true,\"ExtendNotificationMinutesBeforeEnd\":15,\"DefaultBookingTitle\":\"Instant Meeting\",\"DefaultHostName\":\"Screen Booking\",\"HideMeetingTitle\":false,\"HideMeetingOrganiser\":false,\"Use24HourFormat\":true,\"ScreenAdminPinEnabled\":true,\"ScreenAdminPin\":0,\"SupportedRfidTypes\":15,\"IsBleEnabled\":true,\"EnableAvailabilityData\":true,\"WorkspaceType\":\"Room\"}";
var builder = new DeviceSettingsBuilder(jsonData);
var director = new DeviceSettingsDirector(builder);
director.BuildExchangeRoomSettings();
var settings = builder.GetDeviceSettings();
string jsonDataRedux = JsonConvert.SerializeObject(settings);
Console.WriteLine(jsonDataRedux);
public class DeviceSettingsDirector
private readonly IDeviceSettingBuilder _deviceSettingsBuilder;
public DeviceSettingsDirector(IDeviceSettingBuilder deviceSettingsBuilder)
_deviceSettingsBuilder = deviceSettingsBuilder;
public void BuildRoomSettings()
public void BuildExchangeRoomSettings()
.BuildExchangeRoomSettings();
public interface IDeviceSettingBuilder
IDeviceSettingBuilder BuildGeneralSettings();
IDeviceSettingBuilder BuildDeskSettings();
IDeviceSettingBuilder BuildRoomSettings();
IDeviceSettingBuilder BuildExchangeRoomSettings();
DeviceSettings GetDeviceSettings();
public class DeviceSettingsBuilder : IDeviceSettingBuilder
private string _settings;
private DeviceSettings _deviceSettings;
public DeviceSettingsBuilder(string settings)
_deviceSettings = new DeviceSettings();
public IDeviceSettingBuilder BuildGeneralSettings() {
_deviceSettings.generalSettings = new GeneralSettings();
_deviceSettings.generalSettings = JsonConvert.DeserializeObject<GeneralSettings>(_settings);
public IDeviceSettingBuilder BuildDeskSettings(){
_deviceSettings.deskSettings = new DeskSettings();
public IDeviceSettingBuilder BuildRoomSettings(){
_deviceSettings.roomSettings = new RoomSettings();
_deviceSettings.roomSettings = JsonConvert.DeserializeObject<RoomSettings>(_settings);
public IDeviceSettingBuilder BuildExchangeRoomSettings(){
_deviceSettings.exchangeRoomSettings = new ExchangeRoomSettings();
public DeviceSettings GetDeviceSettings()
var deviceSettings = _deviceSettings;
private void Clear() { _deviceSettings = new DeviceSettings(); }
public class DeviceSettings {
public GeneralSettings generalSettings { get; set;}
[JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
public DeskSettings deskSettings { get; set;}
[JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
public RoomSettings roomSettings { get; set;}
[JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
public ExchangeRoomSettings exchangeRoomSettings { get; set;}
public string ErrorMessage { get; private set; }
public class GeneralSettings : BaseModel
public string AccountId { get; set; }
public string CalendarServiceId { get; set; }
public string Name { get; set; }
public string WorkspaceType { get; set;}
public class DeskSettings
public DateTime BookingHoursAM { get; set; }
public class RoomSettings
public bool LogInNeededToBook { get; set; }
public bool LogInNeededToStart { get; set; }
public class ExchangeRoomSettings
public bool EnableAvailabilityData { get; set; }