I am trying to convert the nested Json array string into a dataTable. My code is working fine, creating fine Data Table. But now customer requirement changes and I am struggling to find a way out to get the below structure.
The requirement is whenever the Json Value is an array the data should come as seperate row.
Any help is really appreciated !!
Sample JSON structure:
{ "A": "A0" , "B" : { "B2" : "B2- Val", "B3" : [{"B30" : "B30 - Val1" ,"B31" : "B31 - Val1"}]}, "C": ["C0", "C1"]}
Current DataTable output structure:
Required DataTable Structure:
Original C# code:
public DataTable JsonStringToDataTable(string jsonString)
{
LoggingUtil.LogMessage("GetReceiver :: JsonStringToDataTable :: Enters", LogLevel.Debug);
DataTable dt = new DataTable();
List<string> lstColumnName = new List<string>();
List<string> lstRowData = new List<string>();
try
{
lstColumnName = ConvertJsonToList(jsonString, false);
foreach (string AddColumnName in lstColumnName)
{
DataColumnCollection columns = dt.Columns;
string colName = AddColumnName.ToLower();
if (!columns.Contains(colName))
{
dt.Columns.Add(colName);
}
}
lstRowData = ConvertJsonToList(jsonString, true);
DataRow nr = dt.NewRow();
for (int i = 0; i < lstRowData.Count; i++)
{
try
{
string RowColumns = lstColumnName[i];
string RowDataString = lstRowData[i];
nr[RowColumns] = RowDataString;
}
catch (Exception ex)
{
//continue;
throw ex;
}
}
dt.Rows.Add(nr);
}
catch (Exception ex)
{
LoggingUtil.LogMessage("GetReceiver :: JsonStringToDataTable :: Error while creating datatable from JSON string :: " + ex.Message, LogLevel.Debug);
throw ex;
}
finally
{
LoggingUtil.LogMessage("GetReceiver :: JsonStringToDataTable :: Exits", LogLevel.Debug);
}
return dt;
}
public static List<string> ConvertJsonToList(string jsonString, bool isValue)
{
LoggingUtil.LogMessage("GetReceiver :: ConvertJsonToList :: Enters", LogLevel.Debug);
DataTable dt = new DataTable();
var jObj = JObject.Parse(jsonString);
List<string> lstData = new List<string>();
try
{
if (isValue)
{
lstData = AddJsonObjects(jObj, "JSON", lstData, true, false);
}
else
{
lstData = AddJsonObjects(jObj, "JSON", lstData, false, false);
}
}
catch (Exception ex)
{
LoggingUtil.LogMessage("GetReceiver :: ConvertJsonToList :: Error :: " + ex.Message, LogLevel.Debug);
throw ex;
}
finally
{
LoggingUtil.LogMessage("GetReceiver :: ConvertJsonToList :: Exits", LogLevel.Debug);
}
return lstData;
}
public static List<string> AddJsonObjects(JObject jObj, string name, List<string> ColumnsName, bool isValue, bool isArrayObject)
{
foreach (var property in jObj.Properties())
{
string strName = name + "." + property.Name;
if (isArrayObject && !isValue)
{
ColumnsName = AddTokenValues(property.Value, strName, ColumnsName, isValue, true);
}
else
{
ColumnsName = AddTokenValues(property.Value, property.Name, ColumnsName, isValue, false);
}
}
return ColumnsName;
}
public static List<string> AddTokenValues(JToken token, string name, List<string> ColumnsName, bool isValue, bool isArrayObject)
{
if (token is JValue)
{
if (isValue)
{
string value = string.Empty;
if (token.Type != JTokenType.Null)
{
value = ((JValue)token).Value.ToString();
}
ColumnsName.Add(value);
}
else
{
ColumnsName.Add(name);
}
}
else if (token is JArray)
{
ColumnsName = AddArrayValues((JArray)token, name, ColumnsName, isValue);
}
else if (token is JObject)
{
ColumnsName = AddJsonObjects((JObject)token, name, ColumnsName, isValue, true);
}
return ColumnsName;
}
public static List<string> AddArrayValues(JArray array, string name, List<string> dataList, bool isValue)
{
for (var i = 0; i < array.Count; i++)
{
dataList = AddTokenValues(array[i], string.Format("[{0}]", name + "[" + i.ToString() + "]"), dataList, isValue, true);
}
return dataList;
}

