Category / Section
How to populate SfDataGrid with JSON data?
JSON data cannot be bound directly to SfDataGrid. To bind SfDataGrid with JSON data, we must deserialize the JSON data to a bindable format. You can use the open source NuGet Newtonsoft.Json to serialize and deserialize JSON objects.
JSON data can be parsed into an ExpandoObject using JsonConvert.DeserializeObject List<ExpandoObject>(json_object).
Refer the below example in which the ExpandoObject list is converted to an ObservableCollection and bound to a SfDataGrid.
ViewModel.cs
public class ViewModel
{
public const string jsonData = "[{\"OrderID\":1,\"EmployeeID\":100,\"FirstName\":'Gina',\"LastName\":'Gable'}," +
"{\"OrderID\":2,\"EmployeeID\":200,\"FirstName\":'Danielle',\"LastName\":'Rooney'}," +
"{\"OrderID\":3,\"EmployeeID\":300,\"FirstName\":'Frank',\"LastName\":'Gable'},]";
public ObservableCollection<dynamic > DynamicCollection { get; set; }
public List<ExpandoObject> DynamicJsonCollection { get; set; }
public ViewModel()
{
DynamicJsonCollection = JsonConvert.DeserializeObject<List<ExpandoObject>>(jsonData); DynamicCollection = PopulateData();
}
private ObservableCollection<dynamic > PopulateData()
{
var data = new ObservableCollection<dynamic>();
foreach (var item in DynamicJsonCollection)
{
data.Add(item);
}
return data;
}
}
MainPage.cs
You can set the deserialized data to the SfDataGrid as shown below.
public class MainActivity : Activity
{
SfDataGrid grid;
ViewModel viewModel;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
grid = new SfDataGrid(BaseContext);
viewModel = new ViewModel();
grid.AllowSorting = true;
grid.AutoGenerateColumns = false;
grid.ColumnSizer = ColumnSizer.Star;
grid.ItemsSource = viewModel.DynamicCollection;
grid.Columns.Add(new GridTextColumn()
{
HeaderText = "Order ID",
MappingName = "OrderID",
LineBreakMode = LineBreakMode.WordWrap,
TextAlignment = Android.Views.GravityFlags.Left,
HeaderTextAlignment = Android.Views.GravityFlags.Left,
});
grid.Columns.Add(new GridTextColumn()
{
HeaderText = "Customer ID",
MappingName = "EmployeeID",
LineBreakMode = LineBreakMode.WordWrap,
TextAlignment = Android.Views.GravityFlags.Left,
HeaderTextAlignment = Android.Views.GravityFlags.Left,
});
grid.Columns.Add(new GridTextColumn()
{
HeaderText = "First Name",
MappingName = "FirstName",
LineBreakMode = LineBreakMode.WordWrap,
TextAlignment = Android.Views.GravityFlags.Left,
HeaderTextAlignment = Android.Views.GravityFlags.Left,
});
grid.Columns.Add(new GridTextColumn()
{
HeaderText = "Last Name",
MappingName = "LastName",
LineBreakMode = LineBreakMode.WordWrap,
TextAlignment = Android.Views.GravityFlags.Left,
HeaderTextAlignment = Android.Views.GravityFlags.Left,
});
SetContentView (grid);
}
}