Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Newtonsoft.Json.JsonSerializationException(从';System.Data.SqlTypes.SqlDouble上的';value&';获取值时出错)序列化SqlGeography_C#_Sql Server_Json_Geolocation_Json.net - Fatal编程技术网

C# Newtonsoft.Json.JsonSerializationException(从';System.Data.SqlTypes.SqlDouble上的';value&';获取值时出错)序列化SqlGeography

C# Newtonsoft.Json.JsonSerializationException(从';System.Data.SqlTypes.SqlDouble上的';value&';获取值时出错)序列化SqlGeography,c#,sql-server,json,geolocation,json.net,C#,Sql Server,Json,Geolocation,Json.net,我尝试在SQL server 2012数据库中使用Newtonsoft.Json版本“Newtonsoft.Json.10.0.3”将DataTable对象序列化为Json 该表有一个类型为“geography”的列,其中包含类型为的实例 用于生成json的代码: public string SerializeToJson() { var connstring1 ="Data Source=server1;Initial Catalog=database1;user=

我尝试在SQL server 2012数据库中使用Newtonsoft.Json版本“Newtonsoft.Json.10.0.3”将
DataTable
对象序列化为Json

该表有一个类型为“geography”的列,其中包含类型为的实例

用于生成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:从“System.Data.SqlTypes.SqlDouble”上的“value”获取值时出错。“-->

System.Data.SqlTypes.SqlNullValueException:数据为空。 无法对空值调用此方法或属性。 在System.Data.SqlTypes.SqlDouble.get_Value()处 在GetValue(对象)处 位于Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(对象目标)

我够到了,但它帮不上忙

任何有助于解决问题的方法

编辑:

基于@dbc注释,我提供了用于生成json的完整源代码

完整的错误消息是:

Newtonsoft.Json.JsonSerializationException:从'System.Data.SqlTypes.SqlDouble'上的'value'获取值时出错。“-->System.Data.SqlTypes.SqlNullValueException:数据为空。无法对空值调用此方法或属性。 在System.Data.SqlTypes.SqlDouble.get_Value()处 在GetValue(对象)处 位于Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(对象目标)

---内部异常堆栈跟踪的结束--- 位于Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(对象目标)

位于Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter编写器、对象值、JsonContainerContract、JsonProperty成员、JsonProperty属性、JsonContract和memberContract、对象和成员值) 位于Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializationObject (JsonWriter编写器,对象值,JsonObjectContract合同,JsonProperty成员,JsonContainerContract集合合同,JsonProperty容器属性) 位于Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue( JsonWriter编写器,对象值,JsonContract valueContract,JsonProperty成员 ,JSONCONTAINERCONTAINERCONTAINERCONTAINERCONTRACT,JsonProperty containerProperty) 位于Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializationObject (JsonWriter编写器,对象值,JsonObjectContract合同,JsonProperty成员,JsonContainerContract集合合同,JsonProperty容器属性) 位于Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue( JsonWriter编写器,对象值,JsonContract valueContract,JsonProperty成员 ,JSONCONTAINERCONTAINERCONTAINERCONTAINERCONTRACT,JsonProperty containerProperty) 位于Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.serializate(JsonWriter JsonWriter,对象值,类型objectType) 位于Newtonsoft.Json.Serialization.JsonSerializerProxy.serializationinternal(JsonWriter-JsonWriter,对象值,类型rootType) 在Newtonsoft.Json.Converters.DataTableConverter.WriteJson(JsonWriter, 对象值,JsonSerializer序列化程序) 位于Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serializer 表(JsonWriter编写器、JsonConverter转换器、对象值、JsonContract契约、JsonContainerContract集合契约、JsonProperty容器属性)

位于Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue( JsonWriter编写器,对象值,JsonContract valueContract,JsonProperty成员 ,JSONCONTAINERCONTAINERCONTAINERCONTAINERCONTRACT,JsonProperty containerProperty) 位于Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.serializate(JsonWriter JsonWriter,对象值,类型objectType) 位于Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter JsonWriter,对象值,类型objectType) 位于Newtonsoft.Json.JsonConvert.SerializeObjectInternal(对象值、类型、JsonSerializer JsonSerializer) 位于Newtonsoft.Json.JsonConvert.SerializeObject(对象值,JsonSerializerSettings设置) 在F:\jsontest.cs中的jsontest.SerializeToJson()处:第104行

Edit2:

我按照@dbc所述启用跟踪,并获得以下日志:

2017-08-24T19:45:31.941 Info开始使用转换器Newtonsoft.Json.Converters.DataTableConverter序列化System.Data.DataTable。路径“”

2017-08-24T19:45:31.972信息已开始序列化Microsoft.SqlServer.Types.SqlGeography。路径“[0].f1”

2017-08-24T19:45:32.003信息已开始序列化System.Data.SqlTypes.SqlInt32.Path'[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时出错。从“System.Data.SqlTypes.SqlDouble”上的“value”获取值时出错

2017-08-24T19:45:32.003序列化System.Data.DataTable时出错。从“System.Data.SqlTypes.SqlDouble”上的“value”获取值时出错<
public static class SqlPrimitiveConverters
{
    public static JsonSerializerSettings AddSqlConverters(this JsonSerializerSettings settings)
    {
        foreach (var converter in converters)
            settings.Converters.Add(converter);
        return settings;
    }

    static readonly JsonConverter[] converters = new JsonConverter[]
    {
        new SqlBinaryConverter(),
        new SqlBooleanConverter(),
        new SqlByteConverter(),
        new SqlDateTimeConverter(),
        new SqlDecimalConverter(),
        new SqlDoubleConverter(),
        new SqlGuidConverter(),
        new SqlInt16Converter(),
        new SqlInt32Converter(),
        new SqlInt64Converter(),
        new SqlMoneyConverter(),
        new SqlSingleConverter(),
        new SqlStringConverter(),
        // TODO: converters for primitives from System.Data.SqlTypes that are classes not structs:
        // SqlBytes, SqlChars, SqlXml
        // Maybe SqlFileStream
    };
}

abstract class SqlPrimitiveConverterBase<T> : JsonConverter where T : struct, INullable, IComparable
{
    protected abstract object GetValue(T sqlValue);

    public override bool CanConvert(Type objectType)
    {
        return typeof(T) == objectType;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        T sqlValue = (T)value;
        if (sqlValue.IsNull)
            writer.WriteNull();
        else
        {
            serializer.Serialize(writer, GetValue(sqlValue));
        }
    }
}

class SqlBinaryConverter : SqlPrimitiveConverterBase<SqlBinary>
{
    protected override object GetValue(SqlBinary sqlValue) { return sqlValue.Value; }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return SqlBinary.Null;
        return (SqlBinary)serializer.Deserialize<byte[]>(reader);
    }
}

class SqlBooleanConverter : SqlPrimitiveConverterBase<SqlBoolean>
{
    protected override object GetValue(SqlBoolean sqlValue) { return sqlValue.Value; }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return SqlBoolean.Null;
        return (SqlBoolean)serializer.Deserialize<bool>(reader);
    }
}

class SqlByteConverter : SqlPrimitiveConverterBase<SqlByte>
{
    protected override object GetValue(SqlByte sqlValue) { return sqlValue.Value; }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return SqlByte.Null;
        return (SqlByte)serializer.Deserialize<byte>(reader);
    }
}

class SqlDateTimeConverter : SqlPrimitiveConverterBase<SqlDateTime>
{
    protected override object GetValue(SqlDateTime sqlValue) { return sqlValue.Value; }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return SqlDateTime.Null;
        return (SqlDateTime)serializer.Deserialize<DateTime>(reader);
    }
}

class SqlDecimalConverter : SqlPrimitiveConverterBase<SqlDecimal>
{
    protected override object GetValue(SqlDecimal sqlValue) { return sqlValue.Value; }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return SqlDecimal.Null;
        return (SqlDecimal)serializer.Deserialize<decimal>(reader);
    }
}

class SqlDoubleConverter : SqlPrimitiveConverterBase<SqlDouble>
{
    protected override object GetValue(SqlDouble sqlValue) { return sqlValue.Value; }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return SqlDouble.Null;
        return (SqlDouble)serializer.Deserialize<double>(reader);
    }
}

class SqlGuidConverter : SqlPrimitiveConverterBase<SqlGuid>
{
    protected override object GetValue(SqlGuid sqlValue) { return sqlValue.Value; }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return SqlGuid.Null;
        return (SqlGuid)serializer.Deserialize<Guid>(reader);
    }
}

class SqlInt16Converter : SqlPrimitiveConverterBase<SqlInt16>
{
    protected override object GetValue(SqlInt16 sqlValue) { return sqlValue.Value; }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return SqlInt16.Null;
        return (SqlInt16)serializer.Deserialize<short>(reader);
    }
}

class SqlInt32Converter : SqlPrimitiveConverterBase<SqlInt32>
{
    protected override object GetValue(SqlInt32 sqlValue) { return sqlValue.Value; }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return SqlInt32.Null;
        return (SqlInt32)serializer.Deserialize<int>(reader);
    }
}

class SqlInt64Converter : SqlPrimitiveConverterBase<SqlInt64>
{
    protected override object GetValue(SqlInt64 sqlValue) { return sqlValue.Value; }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return SqlInt64.Null;
        return (SqlInt64)serializer.Deserialize<long>(reader);
    }
}

class SqlMoneyConverter : SqlPrimitiveConverterBase<SqlMoney>
{
    protected override object GetValue(SqlMoney sqlValue) { return sqlValue.Value; }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return SqlMoney.Null;
        return (SqlMoney)serializer.Deserialize<decimal>(reader);
    }
}

class SqlSingleConverter : SqlPrimitiveConverterBase<SqlSingle>
{
    protected override object GetValue(SqlSingle sqlValue) { return sqlValue.Value; }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return SqlSingle.Null;
        return (SqlSingle)serializer.Deserialize<float>(reader);
    }
}

class SqlStringConverter : SqlPrimitiveConverterBase<SqlString>
{
    protected override object GetValue(SqlString sqlValue) { return sqlValue.Value; }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return SqlString.Null;
        return (SqlString)serializer.Deserialize<string>(reader);
    }
}
public class TableRowDTO
{
    [JsonConverter(typeof(SqlGeographyConverter))]
    public SqlGeography f1 { get; set; }
    public int id { get; set; }
}
var settings = new JsonSerializerSettings().AddSqlConverters();
var list = JsonConvert.DeserializeObject<List<TableRowDTO>>(jsonString, settings);
public class SqlGeographyResult
    {
        private byte[] bytes { get; }

        public SqlGeographyResult(SqlGeography geography)
        {
            bytes = geography.Serialize().Value;
        }

        public SqlGeography ToGeography()
        {
            return SqlGeography.Deserialize(new System.Data.SqlTypes.SqlBytes(bytes));
        }
    }