# RadzenDataGrid, Grouping JToken

**URL:** <https://forum.radzen.com/t/radzendatagrid-grouping-jtoken/19931>\
**Category:** Radzen.Blazor Components\
**Created:** [March 14, 2025, 12:02am UTC](https://forum.radzen.com/t/radzendatagrid-grouping-jtoken/19931 "2025-03-14T00:02:19Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Scnck](https://forum.radzen.com/user_avatar/forum.radzen.com/scnck/32/11303_2.png) [@Scnck](https://forum.radzen.com/u/Scnck)\
**Post date:** [March 14, 2025, 12:02am UTC](https://forum.radzen.com/t/radzendatagrid-grouping-jtoken/19931/1 "2025-03-14T00:02:19Z")

</div>

the following code worked until 5.9.9 any version greater breaks; am I doing something wrong or is there a bug with the latest versions of Radzen?

```auto
@page "/dynamic-data-grid"

@using Newtonsoft.Json
@using Newtonsoft.Json.Linq

<h1>Dynamic Data Grid with Grouping</h1>

<RadzenDataGrid Data="@data"
                Render="OnRender"
                GroupRowRender="OnGroupRowRender">
    <GroupHeaderTemplate>
        @context.GroupDescriptor.GetTitle()
    </GroupHeaderTemplate>
    <Columns>
        @foreach (var property in ((JObject)data.First()).Properties().Select(p => p.Name).ToList())
        {
            <RadzenDataGridColumn TItem="JToken"
                                  Property="@property"
                                  Title="@property">
                <Template>
                    <div>
                        @(context.Value<dynamic>(property)?.ToString())
                    </div>
                </Template>
            </RadzenDataGridColumn>
        }
    </Columns>
</RadzenDataGrid>

@code {
    bool? groupsExpanded;
    private JToken data = default!;

    protected override async Task OnInitializedAsync() => await LoadData();

    private async Task LoadData()
    {
        // Simulating JSON data (replace this with your actual JSON data source)
        string jsonString = @"[
            {""Id"": 1, ""Name"": ""John Doe"", ""Department"": ""IT"", ""Salary"": 75000},
            {""Id"": 2, ""Name"": ""Jane Smith"", ""Department"": ""HR"", ""Salary"": 65000},
            {""Id"": 3, ""Name"": ""Bob Johnson"", ""Department"": ""IT"", ""Salary"": 80000},
            {""Id"": 4, ""Name"": ""Alice Brown"", ""Department"": ""Finance"", ""Salary"": 70000},
            {""Id"": 5, ""Name"": ""Charlie Wilson"", ""Department"": ""HR"", ""Salary"": 62000}
        ]";

        // Parse the JSON string to a JToken
        data = await Task.FromResult(JToken.Parse(jsonString));
    }

    void OnRender(DataGridRenderEventArgs<JToken> args)
    {
        if (args.FirstRender)
        {
            args.Grid.Groups.Add(new GroupDescriptor() { Title = "Department", Property = "Department", SortOrder = SortOrder.Descending });
            StateHasChanged();
        }
    }

    void OnGroupRowRender(GroupRowRenderEventArgs args)
    {
        args.Expanded = groupsExpanded;
    }
}

```

---

<div class="post-metadata">

**Author:** ![enchev](https://forum.radzen.com/user_avatar/forum.radzen.com/enchev/32/16_2.png) [@enchev](https://forum.radzen.com/u/enchev)\
**Post date:** [March 14, 2025, 6:09am UTC](https://forum.radzen.com/t/radzendatagrid-grouping-jtoken/19931/2 "2025-03-14T06:09:49Z")

</div>

In Radzen.Blazor 6.x we dropped support for Dynamic LINQ library (which supported Newtonsoft) due to vulnerability issues:

> [@Just released our new major version of Radzen.Blazor 6.0.0 without reference to System.Linq.Dynamic.Core NuGet package](http://forum.radzen.com/t/just-released-our-new-major-version-of-radzen-blazor-6-0-0-without-reference-to-system-linq-dynamic-core-nuget-package/19748):
>
> Hey folks, We just released our new major version of Radzen.Blazor 6.0.0 without reference to System.Linq.Dynamic.Core NuGet package, due to recent turmoil related to this package vulnerability issues. Although the author of the popular Dynamic LINQ library fixed the reported problems we've decided to reimplement everything related in Radzen.Blazor from scratch including: Filtering, sorting, grouping, member access, etc. in components like DataGrid, DataFilter, DropDown, DropDownDataGrid, Lis…

Here is how to achieve the same without third party dependencies:

```auto
<RadzenDataGrid Data="@data"
                Render="OnRender"
                GroupRowRender="OnGroupRowRender">
    <GroupHeaderTemplate>
        @context.GroupDescriptor.GetTitle()
    </GroupHeaderTemplate>
    <Columns>
        @foreach (var property in data.First().Keys)
        {
            <RadzenDataGridColumn TItem="IDictionary<string, object>"
                                  Property="@PropertyAccess.GetDynamicPropertyExpression(property, typeof(string))"
                                  Title="@property">
                <Template>
                        @context[property]
                </Template>
            </RadzenDataGridColumn>
        }
    </Columns>
</RadzenDataGrid>

@code {
    bool? groupsExpanded;
    private IEnumerable<IDictionary<string, object>> data;

    protected override async Task OnInitializedAsync() => await LoadData();

    private async Task LoadData()
    {
        string jsonString = @"[
            {""Id"": 1, ""Name"": ""John Doe"", ""Department"": ""IT"", ""Salary"": 75000},
            {""Id"": 2, ""Name"": ""Jane Smith"", ""Department"": ""HR"", ""Salary"": 65000},
            {""Id"": 3, ""Name"": ""Bob Johnson"", ""Department"": ""IT"", ""Salary"": 80000},
            {""Id"": 4, ""Name"": ""Alice Brown"", ""Department"": ""Finance"", ""Salary"": 70000},
            {""Id"": 5, ""Name"": ""Charlie Wilson"", ""Department"": ""HR"", ""Salary"": 62000}
        ]";

        data = System.Text.Json.JsonSerializer.Deserialize<List<Dictionary<string, object>>>(jsonString)
        .Select(dict => dict.ToDictionary(kvp => kvp.Key, kvp => (object)kvp.Value?.ToString() ?? string.Empty));
    }

    void OnRender(DataGridRenderEventArgs<IDictionary<string, object>> args)
    {
        if (args.FirstRender)
        {
            args.Grid.Groups.Add(new GroupDescriptor() { Title = "Department", Property = PropertyAccess.GetDynamicPropertyExpression("Department", typeof(string)), SortOrder = SortOrder.Descending });
            StateHasChanged();
        }
    }

    void OnGroupRowRender(GroupRowRenderEventArgs args)
    {
        args.Expanded = groupsExpanded;
    }
}

```

---

<div class="post-metadata">

**Author:** ![Scnck](https://forum.radzen.com/user_avatar/forum.radzen.com/scnck/32/11303_2.png) [@Scnck](https://forum.radzen.com/u/Scnck)\
**Post date:** [October 7, 2026, 7:09pm UTC](https://forum.radzen.com/t/radzendatagrid-grouping-jtoken/19931/3 "2026-10-07T19:09:40Z")

</div>

grouping doesn’t work with IDictionary\<string, object\>

---

<div class="post-metadata">

**Author:** ![enchev](https://forum.radzen.com/user_avatar/forum.radzen.com/enchev/32/16_2.png) [@enchev](https://forum.radzen.com/u/enchev)\
**Post date:** [October 8, 2026, 3:52am UTC](https://forum.radzen.com/t/radzendatagrid-grouping-jtoken/19931/4 "2026-10-08T03:52:07Z")

</div>

![image](https://forum.radzen.com/uploads/default/original/3X/3/2/32530dfe4c5c2760cd194932740254b7a7b8d379.png)

 ![image](https://forum.radzen.com/uploads/default/original/3X/7/e/7ef7cc79c58860ec474781dc5237c5d71349b0f6.png)
