我最近需要将数据表序列化为JSON。我现在仍然在.Net 2.0上,因此我无法在.Net
3.5中使用JSON序列化程序。我想这一定让我去寻找在线和已经做过,发现一个数量的不同
选项。其中一些依赖于附加的库,在这里我很难过。其他人则需要先将转换为List<Dictionary<>>
,这似乎有点尴尬和不必要。另一个将所有值都视为一个字符串。由于一个或另一个原因,我无法真正落后于任何一个,所以我决定自己动手制作,发布在下面。
从阅读//TODO
评论中可以看出,在某些地方它是不完整的。该代码已经在此处生产,因此它在基本意义上可以“工作”。它不完整的地方是我们知道生产数据当前不会达到的地方(数据库中没有时间跨度或字节数组)。我在这里发布的原因是,我觉得这样可以做得更好,并且我想帮助完成和改进此代码。任何输入欢迎。
请注意,此功能内置于.Net 3.5及更高版本中,因此,今天仍然使用此代码的唯一原因是,如果您仍然限于.Net 2.0。
即使这样,JSON.Net仍已成为此类事情的转到库。
public static class JSONHelper
{
public static string FromDataTable(DataTable dt)
{
string rowDelimiter = "";
StringBuilder result = new StringBuilder("[");
foreach (DataRow row in dt.Rows)
{
result.Append(rowDelimiter);
result.Append(FromDataRow(row));
rowDelimiter = ",";
}
result.Append("]");
return result.ToString();
}
public static string FromDataRow(DataRow row)
{
DataColumnCollection cols = row.Table.Columns;
string colDelimiter = "";
StringBuilder result = new StringBuilder("{");
for (int i = 0; i < cols.Count; i++)
{ // use index rather than foreach, so we can use the index for both the row and cols collection
result.Append(colDelimiter).Append("\"")
.Append(cols[i].ColumnName).Append("\":")
.Append(JSONValueFromDataRowObject(row[i], cols[i].DataType));
colDelimiter = ",";
}
result.Append("}");
return result.ToString();
}
// possible types:
// http://msdn.microsoft.com/en-us/library/system.data.datacolumn.datatype(VS.80).aspx
private static Type[] numeric = new Type[] {typeof(byte), typeof(decimal), typeof(double),
typeof(Int16), typeof(Int32), typeof(SByte), typeof(Single),
typeof(UInt16), typeof(UInt32), typeof(UInt64)};
// I don't want to rebuild this value for every date cell in the table
private static long EpochTicks = new DateTime(1970, 1, 1).Ticks;
private static string JSONValueFromDataRowObject(object value, Type DataType)
{
// null
if (value == DBNull.Value) return "null";
// numeric
if (Array.IndexOf(numeric, DataType) > -1)
return value.ToString(); // TODO: eventually want to use a stricter format. Specifically: separate integral types from floating types and use the "R" (round-trip) format specifier
// boolean
if (DataType == typeof(bool))
return ((bool)value) ? "true" : "false";
// date -- see http://weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx
if (DataType == typeof(DateTime))
return "\"\\/Date(" + new TimeSpan(((DateTime)value).ToUniversalTime().Ticks - EpochTicks).TotalMilliseconds.ToString() + ")\\/\"";
// TODO: add Timespan support
// TODO: add Byte[] support
//TODO: this would be _much_ faster with a state machine
//TODO: way to select between double or single quote literal encoding
//TODO: account for database strings that may have single \r or \n line breaks
// string/char
return "\"" + value.ToString().Replace(@"\", @"\\").Replace(Environment.NewLine, @"\n").Replace("\"", @"\""") + "\"";
}
}
更新:
现在已经很老了,但是我想指出一些有关此代码如何处理日期的信息。当时,我使用的格式对于url中的确切原理很有意义。但是,该理由包括以下内容:
坦率地说,JSON Schema通过将字符串“子类型化”为日期文字确实解决了该问题,但这仍在进行中,并且需要很长时间才能被广泛采用。
好吧,时间已经过去了。今天,只使用ISO
8601日期格式就可以了。我不会去更改代码,因为确实如此:这很古老。只需使用JSON.Net。
如果它是.NET
2.0
的Microsoft
AJAX扩展,是否可以帮助您说服老板安装库?
其中包含的是System.Web.Script.Serialization.JavascriptSerializer,该功能在帖子中最后一个链接的第4步中使用。
不幸的是,Kafka Flink连接器只支持-csv、json和avro格式。因此,我不得不使用较低级别的API(数据流)。 问题:如果我可以从datastream对象中创建一个表,那么我就可以接受在该表上运行的查询。它将使转换部分无缝和通用。是否可以在数据流对象上运行SQL查询?
创建表之后,你需要填充数据,你可以通过LOAD DATA和INSERT来实现。 数据格式如下: Whistler Gwen bird \N 1997-12-09 \N 列之间使用\t间隔(LOAD DATA默认的列间隔符),\N表示NULL。 加载文件pet.txt中的数据到表pet中,使用以下命令: mysql> LOAD DATA LOCAL I
我正在使用一个表在Jaspersoft Studio 5.6.1中创建简单的报告。 通过 JRBeanCollectionDataSource 从 Java 向此报告发送数据。 在报告中,我已经可以获取此数据 vie 字段:报告- 现在我可以显示输入的数据了。 但如果我想在表中执行,我需要创建数据集(为什么?)并选择“使用用于填充主报告的相同连接”。将相同的字段添加到新数据集没有帮助,也没有为数据
问题内容: 我有一个5页的Excel文件(.xls格式),我想用我的熊猫数据框的内容替换5页的内容。 问题答案: 根据您的上述需求,您将需要同时使用Python(用于导出熊猫数据框)和VBA(用于删除现有工作表内容并复制/粘贴外部数据)。 使用Python:使用to_csv或to_excel方法。我建议使用to_csv方法,该方法对较大的数据集效果更好。 使用VBA:将源复制并粘贴到目标范围。 幸
很容易将列表列表转换为数据帧: 但是我如何将df转换回列表列表呢?
问题内容: 如果我使用的话 我会得到需要的 。怎么做?? 问题答案: 您可以传递到,迭代键,实例的值对,将每个键和值设置为对象的属性和值