2016-07-29 6 views
1

У меня проблема, и я не могу понять это сам .. В моей программе у меня есть автообновление, когда моя программа обновляет новый (измененный, некоторые новые ключи) файл конфигурации создано. то, что я хочу, чтобы моя программа выполняла, - это когда она обновляется, чтобы посмотреть оба файла конфигурации (старые и новые) и перенести старые параметры, соответствующие ключу в новом файле, в новый файл.Передача значений между 2 конфигурационными файлами

Это пример старого файла:

{ 
    "Setting1": false, 
    "Setting2": 123, 
    "Setting3": "test", 
    "LocationList": { 
    "Country": "NL", 
    "Locations": [ 
     { 
     "Latitude": 38.556807486461118, 
     "Longitude": -121.2383794784546 
     }, 
     { 
     "Latitude": -33.859019, 
     "Longitude": 151.213098 
     }, 
     { 
     "Latitude": 47.5014969, 
     "Longitude": -122.0959568 
     }, 
     { 
     "Latitude": 51.5025343, 
     "Longitude": -0.2055027 
     } 
    ] 
    } 
} 

И это может быть новый файл (также может быть различным):

{ 
    "Setting1": null, 
    "Setting2": null, 
    "Setting3": "", 
    "Setting4": "" 
    "LocationList": { 
    "Country": "", 
    "Locations": [ 
     { 
     "Latitude": null, 
     "Longitude": null 
     }, 
     { 
     "Latitude": null, 
     "Longitude": null 
     } 
    ] 
    } 
} 

Ожидаемый результат:

{ 
    "Setting1": false, 
    "Setting2": 123, 
    "Setting3": "test", 
    "Setting4": "" 
    "LocationList": { 
    "Country": "NL", 
    "Locations": [ 
     { 
     "Latitude": 38.556807486461118, 
     "Longitude": -121.2383794784546 
     }, 
     { 
     "Latitude": -33.859019, 
     "Longitude": 151.213098 
     }, 
     { 
     "Latitude": 47.5014969, 
     "Longitude": -122.0959568 
     }, 
     { 
     "Latitude": 51.5025343, 
     "Longitude": -0.2055027 
     } 
    ] 
    } 
} 

Во-первых, я посмотрел на создание класса в C# и просто десериализую его, затем я пришел к выводу, что это невозможно. se i не знаю, как будет выглядеть конфигурация.

Во-вторых, я подумал, что использование динамика сделает трюк, но этого не произошло, потому что я не знал никаких ключей, которые были в нем. И не мог понять, как это понять.

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

Может кто-нибудь дать мне некоторые идеи о том, как они будут это делать? Мне не нужен код, просто нажмите в правильном направлении.

P.S. я не хочу комбинировать два, когда есть ключ в старом файле, но не в новом, его не нужно переносить (только списки будут полностью перенесены из старого файла, также когда список пустым/заполненным новым).

+0

вы можете редактировать свой вопрос, чтобы добавить ожидаемые результаты – Louis

+0

@Louis, я редактировал вопрос! –

+0

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

ответ

0

Если вы действительно хотите попробовать что-то в JSON, я могу только рекомендовать отличную библиотеку JSON.Net для анализа json для вас. Использование LINQ для JSON можно легко найти соответствующие ключи в рекурсивной образом между старым файлом конфигурации и новее одна и просто скопировать значение от одного к другому

см документации и небольшой пример в http://www.newtonsoft.com/json/help/html/LINQtoJSON.htm

кратко вы можете сделать это в pseudoCode.Очевидно, это не было бы суперэффективным, потому что вы бы рекурсивно проходили два файла много раз и могли быть оптимизированы, но в то же время, если ваши файлы конфигурации не являются чудовищными капли, это не должно создавать никаких проблем на любом современном оборудовании.

//load both config files 

//load the first token in original file and walk recursively 

//for each token try to match in the new file and write data if required using the same recursive technique to walk the other file 
+0

Спасибо, я собираюсь попробовать это сейчас, если он работает, я приму ответ. –

+0

Если вам удастся заставить его работать, можете ли вы опубликовать образец своего кода для дальнейшего использования в ответе? – Louis

+0

я буду, но все еще работаю над этим;) –

0

Мне не нужен код, просто нажмите в правильном направлении.

Сохраните вашу конфигурацию в обычном файле App.config и используйте System.Configuration. В зависимости от сложности конфигурации вы можете либо использовать готовый <appSettings>, либо создать свой собственный раздел (разделы) конфигурации и элементы. Это все еще проще и надежнее, чем при использовании настраиваемой конфигурации.

Вопрос слишком сложный, чтобы начать изобретать колесо только для использования другого (текстового) формата. Даже если вы решите свою текущую проблему, будет больше, которые уже решены где-то в пределах System.Configration ...

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

+0

Спасибо за быстрый ответ, но конфиг исходит из API-интерфейсов для веб-серверов. Beacuse люди могут делиться там конфигурацией. Поэтому мне нужно, чтобы это был JSON. –

0

Оке после некоторых неприятностей мне удалось исправить это (спасибо @Louis).

Это, как я сделал это:

 private static bool TransferConfig(string baseDir, ISession session) 
     { 
      //if (!session.LogicSettings.TransferConfigAndAuthOnUpdate) 
      // return false; 

      var configDir = Path.Combine(baseDir, "Config"); 
      if (!Directory.Exists(configDir)) 
       return false; 

      var oldConf = GetJObject(Path.Combine(configDir, "config.json.old")); 
      var oldAuth = GetJObject(Path.Combine(configDir, "auth.json.old")); 

      GlobalSettings.Load(""); 

      var newConf = GetJObject(Path.Combine(configDir, "config.json")); 
      var newAuth = GetJObject(Path.Combine(configDir, "auth.json")); 

      TransferJSON(oldConf, newConf); 
      TransferJSON(oldAuth, newAuth); 

      File.WriteAllText(Path.Combine(configDir, "config.json"), newConf.ToString()); 
      File.WriteAllText(Path.Combine(configDir, "auth.json"), newAuth.ToString()); 

      return true; 
     } 

     private static JObject GetJObject(string filePath) 
     { 
      return JObject.Parse(File.ReadAllText(filePath)); 
     } 

     private static bool TransferJSON(JObject oldFile, JObject newFile) 
     { 
      try 
      { 
       foreach (var newProperty in newFile.Properties()) 
        foreach (var oldProperty in oldFile.Properties()) 
         if (newProperty.Name.Equals(oldProperty.Name)) 
         { 
          newFile[newProperty.Name] = oldProperty.Value; 
          break; 
         } 

       return true; 
      } 
      catch 
      { 
       return false; 
      } 
     }