using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public class FlattenedRawData
public string EffectiveTIN { get; set; }
public string MeasureID { get; set; }
public int PerformanceMetCount { get; set; }
public string Stratum { get; set; }
public class Measurement_NoStrata
public string measureId { get; set; }
public QualityMeasureValue_NoStrata value { get; set; }
public class Measurement_MultiStrata
public string measureId { get; set; }
public QualityMeasureValue_MultiStrata value { get; set; }
public class QualityMeasureValue_NoStrata
public bool IsEndToEndReported { get; set; }
public int PerformanceMet { get; set; }
public class QualityMeasureValue_MultiStrata
public List<Strata> strata = new List<Strata>();
public bool IsEndToEndReported { get; set; }
public int PerformanceMet { get; set; }
public string Stratum { get; set; }
public class MeasurementSet__NoStrata
public string testTIN { get; set; }
public List<Measurement_NoStrata> measurements { get; set; }
public class MeasurementSet__MultiStrata
public string category { get; set; }
public string testTIN { get; set; }
public List<Measurement_MultiStrata> measurements { get; set; }
public static void Test()
TestMergeDomainObjects();
public static void TestMergeDomainObjects()
IEnumerable<MeasurementSet__NoStrata> measurements1 = GetNoStrataMeasurements();
IEnumerable<MeasurementSet__MultiStrata> measurements2 = GetMultiStrataMeasurements();
IEnumerable<object> measurements = measurements1.Cast<object>()
.Concat(measurements2.Cast<object>());
var serializerSettings = new JsonSerializerSettings
NullValueHandling = NullValueHandling.Ignore,
var mergeSettings = new JsonMergeSettings
MergeArrayHandling = MergeArrayHandling.Concat,
MergeNullValueHandling = MergeNullValueHandling.Ignore,
var serializer = JsonSerializer.CreateDefault(serializerSettings);
.Select(m => JObject.FromObject(m, serializer))
.GroupBy(j => (string)j["testTIN"])
.Select(g => g.Aggregate(new JObject(),
(j1, j2) => { j1.Merge(j2, mergeSettings); return j1; })
.Select(o => { o.Remove("category"); return o; })
Console.WriteLine(JsonConvert.SerializeObject(json, Formatting.Indented));
Assert.IsTrue(json.Count == 1 && JToken.DeepEquals(json[0], JToken.Parse(GetExpectedJson())));
static IEnumerable<MeasurementSet__NoStrata> GetNoStrataMeasurements()
return new [] { JsonConvert.DeserializeObject<MeasurementSet__NoStrata>(GetJsonMeasurements().ElementAt(0)) };
static IEnumerable<MeasurementSet__MultiStrata> GetMultiStrataMeasurements()
return new [] { JsonConvert.DeserializeObject<MeasurementSet__MultiStrata>(GetJsonMeasurements().ElementAt(1)) };
static IEnumerable<string> GetJsonMeasurements()
""IsEndToEndReported"": true,
""IsEndToEndReported"": true,
""IsEndToEndReported"": true,
""IsEndToEndReported"": true,
static string GetExpectedJson()
""IsEndToEndReported"": true,
""IsEndToEndReported"": true,
""IsEndToEndReported"": true,
""IsEndToEndReported"": true,
public static void Main()
Console.WriteLine("Environment version: " + Environment.Version);
Console.WriteLine("Json.NET version: " + typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");