Convertir DataRow, DataTable y DataSet a Json
Hola a todos, como pueden ver este post se los entrego para que comprendan como generar una cadena Json a partir de una objeto DataRow, DataTable o DataSet de C#. Esto es importante cuando trabajamos con ajax para el intercambio de informacion entre el cliente y el servidor. Se los dejo aqui porque cuando estaba desarrollando una aplicacion se me presento ese problema y buscando en mi amigo el google encontre un sitio con una solucion a mi parecer muy buena y eficiente la cual sigo usando en mis proyectos. El sitio se los dejo aqui para que lo vean.
Luego de haber visto ese codigo y analizarlo nos dimos la tarea de generar una DLL que solo con incluirla en nuestras paginas logra convertir cualquiera de estos objetos a Json.
El modo de utilizacion es muy sencillo comienzo aqui:
La DLL se llama DataJsonConverter y despues de copiarla en la carpeta Bin o cualquier otra de nuestra aplicacion le creamos una referencia. Luego en la pagina que la usemos la incluimos using DataJsonConverter; y por ultimo la usamos de esta manera.
/*DataBase.
readQueryTable() realiza la consulta a la base de datos que retorna un DataTable */
DataTable miDataTable = DataBase.readQueryTable(query);
string jsonVar = DataJsonConverter.DataJsonConverter.Serialize(miDataTable);
Este ejemplo es con un DataTable pero de igual forma se hace para los DataSet y DataRow.
Por ultimo es necesario para el correcto funcionamiento de la DLL que se incluya en la misma carpeta de la DLL el JSON.NET( Newtonsoft.Json.dll y Newtonsoft.Json.XML).
Aqui aparece el codigo para generar la DLL. Solo con abrir un proyecto en el Visual Studio copiar en un fichero de codigo y compilarlo en la carpeta bin aparecera la DLL creada. Por supuesto que en mi caso fue DataJsonConverter pero ustedes la generan con el nombre que les paresca.
using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json;
using System.IO;
namespace DataJsonConverter
{
public static class DataJsonConverter
{
private static bool FormatJsonOutput = false;
public static bool FormatOutput
{
get { return FormatJsonOutput; }
set { FormatJsonOutput = value; }
}
public static string Serialize(object value)
{
Type type = value.GetType();
Newtonsoft.Json.JsonSerializer json = new Newtonsoft.Json.JsonSerializer();
json.NullValueHandling = NullValueHandling.Ignore;
json.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace;
json.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore;
json.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
if (type == typeof(DataRow))
json.Converters.Add(new DataRowConverter());
else if (type == typeof(DataTable))
json.Converters.Add(new DataTableConverter());
else if (type == typeof(DataSet))
json.Converters.Add(new DataSetConverter());
StringWriter sw = new StringWriter();
Newtonsoft.Json.JsonTextWriter writer = new JsonTextWriter(sw);
if (FormatJsonOutput)
writer.Formatting = Formatting.Indented;
else
writer.Formatting = Formatting.None;
writer.QuoteChar = ‘»‘;
json.Serialize(writer, value);
string output = sw.ToString();
writer.Close();
sw.Close();
return output;
}
public static object Deserialize(string jsonText, Type valueType)
{
Newtonsoft.Json.JsonSerializer json = new Newtonsoft.Json.JsonSerializer();
json.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
json.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace;
json.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore;
json.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
StringReader sr = new StringReader(jsonText);
Newtonsoft.Json.JsonTextReader reader = new JsonTextReader(sr);
object result = json.Deserialize(reader, valueType);
reader.Close();
return result;
}
}
public class DataRowConverter : JsonConverter
{
///
/// Writes the JSON representation of the object.
///
///
The to write to. ///
The value. public override void WriteJson(JsonWriter writer, object dataRow)
{
DataRow row = dataRow as DataRow;
// *** HACK: need to use root serializer to write the column value
// should be fixed in next ver of JSON.NET with writer.Serialize(object)
JsonSerializer ser = new JsonSerializer();
writer.WriteStartObject();
foreach (DataColumn column in row.Table.Columns)
{
writer.WritePropertyName(column.ColumnName);
ser.Serialize(writer, row[column]);
}
writer.WriteEndObject();
}
///
/// Determines whether this instance can convert the specified value type.
///
///
Type of the value. ///
/// true if this instance can convert the specified value type; otherwise, false.
///
public override bool CanConvert(Type valueType)
{
return typeof(DataRow).IsAssignableFrom(valueType);
}
///
/// Reads the JSON representation of the object.
///
///
The to read from. ///
Type of the object. /// The object value.
public override object ReadJson(JsonReader reader, Type objectType)
{
throw new NotImplementedException();
}
}
///
/// Converts a DataTable to JSON. Note no support for deserialization
///
public class DataTableConverter : JsonConverter
{
///
/// Writes the JSON representation of the object.
///
///
The to write to. ///
The value. public override void WriteJson(JsonWriter writer, object dataTable)
{
DataTable table = dataTable as DataTable;
DataRowConverter converter = new DataRowConverter();
writer.WriteStartObject();
writer.WritePropertyName(«Rows»);
writer.WriteStartArray();
foreach (DataRow row in table.Rows)
{
converter.WriteJson(writer, row);
}
writer.WriteEndArray();
writer.WriteEndObject();
}
///
/// Determines whether this instance can convert the specified value type.
///
///
Type of the value. ///
/// true if this instance can convert the specified value type; otherwise, false.
///
public override bool CanConvert(Type valueType)
{
return typeof(DataTable).IsAssignableFrom(valueType);
}
///
/// Reads the JSON representation of the object.
///
///
The to read from. ///
Type of the object. /// The object value.
public override object ReadJson(JsonReader reader, Type objectType)
{
throw new NotImplementedException();
}
}
///
/// Converts a object to JSON. No support for reading.
///
public class DataSetConverter : JsonConverter
{
///
/// Writes the JSON representation of the object.
///
///
The to write to. ///
The value. public override void WriteJson(JsonWriter writer, object dataset)
{
DataSet dataSet = dataset as DataSet;
DataTableConverter converter = new DataTableConverter();
writer.WriteStartObject();
writer.WritePropertyName(«Tables»);
writer.WriteStartArray();
foreach (DataTable table in dataSet.Tables)
{
converter.WriteJson(writer, table);
}
writer.WriteEndArray();
writer.WriteEndObject();
}
///
/// Determines whether this instance can convert the specified value type.
///
///
Type of the value. ///
/// true if this instance can convert the specified value type; otherwise, false.
///
public override bool CanConvert(Type valueType)
{
return typeof(DataSet).IsAssignableFrom(valueType);
}
///
/// Reads the JSON representation of the object.
///
///
The to read from. ///
Type of the object. /// The object value.
public override object ReadJson(JsonReader reader, Type objectType)
{
throw new NotImplementedException();
}
}
}
Asi termina esto.
Sadudos…..y disfrutenlo.
Como crear un ComboBox con Ext.ux.MetaForm
Este tema se lo dedico a una pregunta que yo mismo hice en el foro de la comunidad de extjs en español y que encontre la respuesta. La pregunta era la siguiente: Como llenar un combobox con el plugin Ext.ux.MetaForm ? y aprovecho para decirles que el mismo se encarga de crear formularios pasandole los datos y estructura desde el server. Esto es realmente sencillo y util cuando tenemos una aplicacion que genera los formularios dinamicos a partir de una base de datos , XML o cualquier fichero de almacenamiento de datos.
Primero, para lograr un formulario debemos crear un JSON con un formato que el plugin logre interpretar y el mismo debe contener varias partes como:
- formConfig que se encarga de la configuracion del formulario.
- fields que sera el arreglo de campos.
- data que es el arreglo que tiene los datos con los cuales se van a mostrar los campos del formulario.
Como se que un ejemplo es mejor que mil palabras aqui les dejo como deberia quedar estructurado todo este json.
/*
Creamos la estructura del Formulario.
*/
$formConfig = array(
"labelAlign"=>"left"
,"columnCount"=>2
,"labelWidth"=>80
,"defaults"=>array(
"width"=>130
)
);
/*Los campos del formulario serian de esta manera y miren el tercer campo es un combo y el $store_total es el strore del combo.
*/
$store_total = array_merge($store_total,array('1' => 'La Habana', '2' => 'Ciego de Avila', '3' => 'CUBA'));
$fields = array(
array(
"name"=>"compName"
,"fieldLabel"=>"Company"
,"editor"=>array(
"allowBlank"=>false
)
)
,array(
"name"=>"compForm"
,"fieldLabel"=>"Legal Form"
,"editor"=>array(
"allowBlank"=>false
)
)
,array(
"name"=>"clientFrom"
,"fieldLabel"=>"Mi Combo"
,"editor"=>array(
"xtype"=>"combo",
"store"=> $store_total
)
));
/*El config agrupa todos los elementos anteriores*/
$config = array(
"success"=>true
,"metaData"=>array(
"fields"=>$fields
,"formConfig"=>$formConfig
)
,"data"=>array(
"compName"=>"My Company"
,"compForm"=>"Company Form"
)
);
/*Generamos el JSON y lo imprimimos*/
echo json_encode($config);
?>
Solo nos queda descargarnos el plugin e incluirlo en la pagina html junto con las librerias de extjs y disfrutarlo.
saludos…
Hello world!
Pensé en cambiar el titulo pero decidí dejar la bienvenida para todos los Blogueros y Blogueras que visiten mi blog. Mi objetivo es compartir algo de la experiencia adquirida en el transcurso de mis estudios y dejar que ustedes, la razón de este blog comenten, den variantes o mejores soluciones de lo que aquí escriba.
Por hoy tengo sueño mañana les presento mi segundo post.
Adiós…