2015-09-20 5 views
-2

Есть ли способ объединить два объекта JSON при сравнении данных, проверяя дублирование данных, а затем выбрав тот, где CreationTimeUtc, LastWriteTimeUtc и Length больше второго?Объединить два объекта Json с условием

if json1= [ 
    { 
    "CreationTimeUtc": "9/20/2015 1:38:22 PM", 
    "LastWriteTimeUtc": "9/20/2015 1:38:22 PM", 
    "Name": "test1.txt", 
    "Length": "1", 
    "owner":"pc1" 
    }, 
    { 
    "CreationTimeUtc": "9/20/2015 1:38:16 PM", 
    "LastWriteTimeUtc": "9/20/2015 1:38:16 PM", 
    "Name": "test2.txt", 
    "Length": "5" , 
    "owner":"pc1" 
    } 
]; 

json2= 
[ 
    { 
    "CreationTimeUtc": "9/20/2015 1:38:22 PM", 
    "LastWriteTimeUtc": "9/21/2015 1:38:22 PM", 
    "Name": "test1.txt", 
    "Length": "1", 
    "owner":"pc2" 
    }, 
    { 
    "CreationTimeUtc": "9/20/2015 1:38:16 PM", 
    "LastWriteTimeUtc": "9/20/2015 1:38:16 PM", 
    "Name": "test2.txt", 
    "Length": "4" , 
    "owner":"pc2" 
    } 
] 
result= 
[ 
    { 
    "CreationTimeUtc": "9/20/2015 1:38:22 PM", 
    "LastWriteTimeUtc": "9/21/2015 1:38:22 PM", 
    "Name": "test1.txt", 
    "Length": "1", 
    "owner":"pc2" 
    }, 
    { 
    "CreationTimeUtc": "9/20/2015 1:38:16 PM", 
    "LastWriteTimeUtc": "9/20/2015 1:38:16 PM", 
    "Name": "test2.txt", 
    "Length": "5" , 
    "owner":"pc1" 
    } 
] 
+0

Предполагается, что это псевдокод? –

+0

этот пример для входов и результатов, которые мне нужны –

+1

Есть ли какая-нибудь магическая сила, мешающая вам писать свой собственный уникальный алгоритм слияния и возвращаться с заданной * проблемой? Потому что это не так, как работает Stack Overflow; прочитайте это: stackoverflow.com/help/how-to-ask –

ответ

-1

Вы можете использовать библиотеку JSON.NET Newtonsoft и LINQ.

Следующий код десериализует анонимные объекты (вы также можете использовать сильно типизированные объекты). Объединяет два списка, группирует их по атрибуту «Имя» и берет первый элемент в каждой группе с максимальными датами и длиной.

Если у вас есть различные бизнес-правила (например, даты больше, но длина не) вы можете возиться с кодом, но это должно быть достаточно, чтобы вы начали:

static void Main(string[] args) 
{ 
    string jsonString1 = File.ReadAllText("sample1.json"); 
    string jsonString2 = File.ReadAllText("sample2.json"); 
    var newType = new[] { new { CreationTimeUtc = DateTime.UtcNow, LastWriteTimeUtc = DateTime.UtcNow, Name = "", Length = "", owner = "" } }; 
    var json1 = JsonConvert.DeserializeAnonymousType(jsonString1, newType); 
    var json2 = JsonConvert.DeserializeAnonymousType(jsonString2, newType); 
    var combined = json1.Union(json2); 

    var results = from c in combined 
      group c by c.Name into g 
      select g.First(i => i.LastWriteTimeUtc == g.Max(m => m.LastWriteTimeUtc) && 
           i.LastWriteTimeUtc == g.Max(m => m.LastWriteTimeUtc) && 
           i.Length == g.Max(m => m.Length)); 

    foreach (var item in results) 
    { 
     Console.WriteLine(item); 
    } 
} 

И выход:

{ CreationTimeUtc = 20/09/2015 13:38:22, LastWriteTimeUtc = 21/09/2015 13:38:22, Name = test1.txt, Length = 1, owner = pc2 } 
{ CreationTimeUtc = 20/09/2015 13:38:16, LastWriteTimeUtc = 20/09/2015 13:38:16, Name = test2.txt, Length = 5, owner = pc1 } 
+1

всегда интересно видеть downvotes без объяснений :-) –