2016-02-23 6 views
0

Скажем, есть пустое это JSON объект:C# сила патч JSON

String obj1 = "{}"; 

Есть ли способ залатать обновить его и создание силы отсутствует путь с помощью C#? Таким образом, после патча, как это:

{ "op": "add", "path": "https://stackoverflow.com/a/b", "value": "foo" }, 

результат будет: { a: { b: "foo" } }

+0

Сомневаюсь, что существует какой-либо особый способ сделать это. Вам, вероятно, придется разобрать оба jsons на объекты и применить преобразования вручную. –

+0

ну, есть такие библиотеки, как JsonDiffPatch, но он генерирует исключение, когда часть пути отсутствует. – Serhiy

+0

Возможно, есть некоторые настройки, которые заставляют JsonDiffPatch создавать отсутствующие узлы? –

ответ

0

не уверен, что это ваша проблема точно, если я ошибаюсь, мой плохой, вы можете создавать эти объекты пользовательских JSon в C# с использованием System.Dynamic.ExpandoObject или с использованием IDictionary, или оба, как в моем примере (случай я ленивый), , как в комментариях, как говорится, это больше похоже на разборе, а не преобразование:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using Newtonsoft.Json; 

namespace ExpandoObject 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string stringObj; 
      stringObj = "{\"op\": \"add\", \"path\": \"https://stackoverflow.com/a/b\", \"value\": \"foo\"}"; 
      Console.WriteLine(JsonConvert.SerializeObject(GetObjectPatchResult(stringObj))); 
      stringObj = "{\"op\": \"add\", \"path\": \"https://stackoverflow.com/a/b/c/d/e/f/g/h/i/j\", \"value\": \"foo\"}"; 
      Console.WriteLine(JsonConvert.SerializeObject(GetObjectPatchResult(stringObj))); 
     } 

     private static object GetObjectPatchResult(string param) 
     { 
      dynamic expando = new System.Dynamic.ExpandoObject(); 
      var result = (IDictionary<string, object>)expando; 
      var parchObject = JsonConvert.DeserializeObject<PatchObject>(param); 
      var level = result; 
      int i = 0; 
      foreach (var path in parchObject.Path.Split('/')) 
      { 
       i++; 
       if (string.IsNullOrEmpty(path)) continue; 
       dynamic pathExpando = new System.Dynamic.ExpandoObject(); 
       level[path] = (IDictionary<string, object>)pathExpando; 
       if (i < parchObject.Path.Split('/').Count()) 
       { 
        level = (IDictionary<string, object>)level[path]; 
       } 
       else 
       { 
        level[path] = parchObject.Value; 
       } 
      } 
      return result; 
     } 
    } 

    public class PatchObject 
    { 
     public string Op { get; set; } 
     public string Path { get; set; } 
     public string Value { get; set; } 
    } 
} 

результат:

{ "а": { "Ъ": "Foo"}}

{ "а": { "Ъ": { "с": { "d": { "е": {"f": {"g": {"h": {"i": {"j": "foo"}}}}}}}}}}

Нажмите любую клавишу, чтобы продолжить. , ,

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