using Newtonsoft.Json.Linq;
using System.Linq.Dynamic.Core;
using System.Collections.Generic;
public static void Main()
var resultString = String.Empty;
String json = "[{\"Name\": \"Mr. Test Smith\",\"Type\": \"ACCOUNTSPAYABLE\",\"Something\": {\"Field1\": \"Test1\",\"Field2\": \"Test2\"}},{\"Name\": \"Mr. Test Smith\",\"Type\": \"DISPATCH\",\"Something\": {\"Field1\": \"Test1\",\"Field2\": \"Test2\"}},{\"Name\": \"Different Name\",\"Type\": \"ACCOUNTSPAYABLE\",\"Something\": {\"Field1\": \"Test3\",\"Field2\": \"Test4\"}}]";
var data = JsonConvert.DeserializeObject<List<JObject>>(json);
var groups = DynamicQueryableExtensions.GroupBy(data.AsQueryable(), "new (Name, Type)");
var stringBuilder = new StringBuilder();
var stringWriter = new StringWriter(stringBuilder);
using (var jsonWriter = new JsonTextWriter(stringWriter))
jsonWriter.WriteStartArray();
foreach (var group in groups.ToDynamicList())
jsonWriter.WriteStartObject();
jsonWriter.WritePropertyName("Key");
jsonWriter.WriteRawValue(JsonConvert.SerializeObject(group.Key));
jsonWriter.WritePropertyName("Values");
jsonWriter.WriteRawValue(JsonConvert.SerializeObject(group));
jsonWriter.WriteEndObject();
jsonWriter.WriteEndArray();
resultString = stringWriter.ToString();
var result = JsonConvert.SerializeObject(JsonConvert.DeserializeObject<List<JObject>>(resultString), Newtonsoft.Json.Formatting.Indented);
Console.WriteLine(result);