我尝试使用Newtonsoft.Json版本“Newtonsoft.Json.10.0.3”将DataTable
对象序列化为Json,该对象在SQL Server 2012数据库中。
该表具有一个类型为“geography”的列,其中包含类型SqlGeography
的实例。
生成json的代码:
public string SerializeToJson()
{
var connstring1 ="Data Source=server1;Initial Catalog=database1;user=xxx;password=yyy";
var sql = "SELECT * FROM table_1 "; //table_1 has a column of type geography
using (var c1 = new SqlConnection(connstring1))
{
c1.Open();
var da = new SqlDataAdapter()
{
SelectCommand = new SqlCommand(sql, c1)
};
DataSet ds1 = new DataSet("table");
da.Fill(ds1, "table");
var dt = ds1.Tables[0];
//serialize to Json
try
{
var options = new JsonSerializerSettings
{
Formatting = Formatting.None
};
//this line fire exception for geography type
var json = JsonConvert.SerializeObject(dt, options);
return json;
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
我已经从sql 2012的功能包中安装了 'Microsoft.SqlServer.Types' 组件。
我创建了一个完整的C#程序(与sql server安装无关),使用带有SqlGeography列的datatable来展示问题。点击尝试
我遇到了以下错误:
Newtonsoft.Json.JsonSerializationException: Error getting value from 'Value' on 'System.Data.SqlTypes.SqlDouble'. --->
System.Data.SqlTypes.SqlNullValueException: Data is Null. This method or property cannot be called on Null values. at System.Data.SqlTypes.SqlDouble.get_Value() at GetValue(Object ) at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)
我查看了 https://github.com/JamesNK/Newtonsoft.Json/issues/993,但是没有得到帮助。
请帮助解决问题。
编辑:
根据 @dbc 的评论,我提供了用于生成json的完整源代码。
完整的错误消息如下:
Newtonsoft.Json.JsonSerializationException: 在“System.Data.SqlTypes.SqlDouble”上从“Value”获取值时出错。 ---> System.Data.SqlTypes.SqlNullValueException: 数据为 Null。该方法或属性不能对 Null 值进行调用。 at System.Data.SqlTypes.SqlDouble.get_Value() at GetValue(Object ) at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target) --- 内部异常堆栈跟踪的结尾 --- at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType) at Newtonsoft.Json.Serialization.JsonSerializerProxy.SerializeInternal(JsonWriter jsonWriter, Object value, Type rootType) at Newtonsoft.Json.Converters.DataTableConverter.WriteJson(JsonWriter writer, Object value, JsonSerializer serializer) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeConver table(JsonWriter writer, JsonConverter converter, Object value, JsonContract contract, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType) at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType) at Newtonsoft.Json.JsonConvert.SerializeObjectInternal(Object value, Type type, JsonSerializer jsonSerializer) at Newtonsoft.Json.JsonConvert.SerializeObject(Object value, JsonSerializerSettings settings) at JsonTester.SerializeToJson() in F:\JsonTester.cs:line 1042017-08-24T19:45:32.003 信息:开始序列化 System.Data.SqlTypes.SqlInt32 路径 '[0].f1.STSrid'。
2017-08-24T19:45:32.003 信息:完成序列化 System.Data.SqlTypes.SqlInt32 路径 '[0].f1.STSrid'。
2017-08-24T19:45:32.003 信息:开始序列化 System.Data.SqlTypes.SqlDouble 路径 '[0].f1.Lat'。
2017-08-24T19:45:32.003 信息:完成序列化 System.Data.SqlTypes.SqlDouble 路径 '[0].f1.Lat'。
2017-08-24T19:45:32.003 信息:开始序列化 System.Data.SqlTypes.SqlDouble 路径 '[0].f1.Long'。
2017-08-24T19:45:32.003 信息:完成序列化 System.Data.SqlTypes.SqlDouble 路径 '[0].f1.Long'。
2017-08-24T19:45:32.003 信息:开始序列化 System.Data.SqlTypes.SqlDouble 路径 '[0].f1.Z'。
2017-08-24T19:45:32.003 错误:无法从 'System.Data.SqlTypes.SqlDouble' 的 'Value' 获取值,导致序列化错误。
2017-08-24T19:45:32.003 错误:无法从 'System.Data.SqlTypes.SqlDouble' 的 'Value' 获取值,导致序列化 System.Data.DataTable 错误。
DataReaderConverter
直接从command.ExecuteReader()
返回的IDataReader
进行序列化,会发生什么情况?ToString()
输出,包括异常类型、消息、回溯和内部异常? - dbcSqlGeometry
类型的实例,但我想确认一下。SqlCommand
获取数据读取器,请参见使用DataReader检索数据。