项目 ORM 基于 SqlSugar 使用 System.Text.Json 序列化 PostGIS geometry 类型异常 或 Swagger一直加载中打不开

Swagger一直loading打不开

其它异常如下

异常1

Unhandled exception. System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. (Parameter 'X called on empty Point')
   at NetTopologySuite.Geometries.Point.get_X()
   at System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1.GetMemberAndWriteJson(Object obj, WriteStack& state, Utf8JsonWriter writer)
   at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryWrite(Utf8JsonWriter writer, T value, JsonSerializerOptions options, WriteStack& state)
   at System.Text.Json.Serialization.JsonConverter`1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
   at System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1.GetMemberAndWriteJson(Object obj, WriteStack& state, Utf8JsonWriter writer)
   at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryWrite(Utf8JsonWriter writer, T value, JsonSerializerOptions options, WriteStack& state)
   at System.Text.Json.Serialization.JsonConverter`1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
   at System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1.GetMemberAndWriteJson(Object obj, WriteStack& state, Utf8JsonWriter writer)
   at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryWrite(Utf8JsonWriter writer, T value, JsonSerializerOptions options, WriteStack& state)
   at System.Text.Json.Serialization.JsonConverter`1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
   at System.Text.Json.Serialization.JsonConverter`1.WriteCore(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
   at System.Text.Json.JsonSerializer.WriteCore[TValue](Utf8JsonWriter writer, TValue& value, JsonTypeInfo`1 jsonTypeInfo)
   at System.Text.Json.JsonSerializer.WriteString[TValue](TValue& value, JsonTypeInfo`1 jsonTypeInfo)
   at System.Text.Json.JsonSerializer.Serialize[TValue](TValue value, JsonSerializerOptions options)
   at Program.Main() in C:\local\code\AllTogetherNow\Daily\Daily.cs:line 66

异常2

Unhandled exception. System.ArgumentException: .NET number values such as positive and negative infinity cannot be written as valid JSON. To make it work when using 'JsonSerializer', consider specifying 'JsonNumberHandling.AllowNamedFloatingPointLiterals' (see https://docs.microsoft.com/dotnet/api/system.text.j
son.serialization.jsonnumberhandling).
   at System.Text.Json.ThrowHelper.ThrowArgumentException_ValueNotSupported()
   at System.Text.Json.Utf8JsonWriter.WriteNumberValue(Double value)
   at System.Text.Json.Serialization.Converters.DoubleConverter.Write(Utf8JsonWriter writer, Double value, JsonSerializerOptions options)
   at System.Text.Json.Serialization.JsonConverter`1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
   at System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1.GetMemberAndWriteJson(Object obj, WriteStack& state, Utf8JsonWriter writer)
   at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryWrite(Utf8JsonWriter writer, T value, JsonSerializerOptions options, WriteStack& state)
   at System.Text.Json.Serialization.JsonConverter`1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
   at System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1.GetMemberAndWriteJson(Object obj, WriteStack& state, Utf8JsonWriter writer)
   at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryWrite(Utf8JsonWriter writer, T value, JsonSerializerOptions options, WriteStack& state)
   at System.Text.Json.Serialization.JsonConverter`1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
   at System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1.GetMemberAndWriteJson(Object obj, WriteStack& state, Utf8JsonWriter writer)
   at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryWrite(Utf8JsonWriter writer, T value, JsonSerializerOptions options, WriteStack& state)
   at System.Text.Json.Serialization.JsonConverter`1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
   at System.Text.Json.Serialization.JsonConverter`1.WriteCore(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
   at System.Text.Json.Serialization.JsonConverter`1.WriteCoreAsObject(Utf8JsonWriter writer, Object value, JsonSerializerOptions options, WriteStack& state)
   at System.Text.Json.JsonSerializer.WriteCore[TValue](Utf8JsonWriter writer, TValue& value, JsonTypeInfo`1 jsonTypeInfo)
   at System.Text.Json.JsonSerializer.Serialize[TValue](Utf8JsonWriter writer, TValue value, JsonSerializerOptions options)
   at System.Text.Json.Nodes.JsonValueNotTrimmable`1.WriteTo(Utf8JsonWriter writer, JsonSerializerOptions options)
   at System.Text.Json.Serialization.Converters.JsonValueConverter.Write(Utf8JsonWriter writer, JsonValue value, JsonSerializerOptions options)
   at System.Text.Json.Serialization.Converters.JsonNodeConverter.Write(Utf8JsonWriter writer, JsonNode value, JsonSerializerOptions options)
   at System.Text.Json.Nodes.JsonObject.WriteTo(Utf8JsonWriter writer, JsonSerializerOptions options)
   at System.Text.Json.Serialization.Converters.JsonObjectConverter.Write(Utf8JsonWriter writer, JsonObject value, JsonSerializerOptions options)
   at System.Text.Json.Serialization.Converters.JsonNodeConverter.Write(Utf8JsonWriter writer, JsonNode value, JsonSerializerOptions options)
   at System.Text.Json.Nodes.JsonArray.WriteTo(Utf8JsonWriter writer, JsonSerializerOptions options)
   at System.Text.Json.Serialization.Converters.JsonArrayConverter.Write(Utf8JsonWriter writer, JsonArray value, JsonSerializerOptions options)
   at System.Text.Json.Serialization.Converters.JsonNodeConverter.Write(Utf8JsonWriter writer, JsonNode value, JsonSerializerOptions options)
   at System.Text.Json.Nodes.JsonObject.WriteTo(Utf8JsonWriter writer, JsonSerializerOptions options)
   at System.Text.Json.Nodes.JsonNode.ToJsonString(JsonSerializerOptions options)

异常3

未处理的异常。System.ArgumentOutOfRangeException:指定的参数超出了有效值的范围。 (参数‘在空点上调用的 X’)
在 NetTopologySuite.Geometries.Point.get_X()
在 System.Text.Json.Serialization.Metadata.JsonPropertyInfo 1.GetMemberAndWriteJson(Object obj, WriteStack& state, Utf8JsonWriter writer) at System.Text.Json.Serialization.Converters.ObjectDefaultConverter1.OnTryWrite(Utf8JsonWriter writer, T value, JsonSerializerOptions options, WriteStack& state)
在 System.Text.Json.Serialization.JsonConverter 1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state) at System.Text.Json.Serialization.Metadata.JsonPropertyInfo1.GetMemberAndWriteJson(Object obj, WriteStack& state, Utf8JsonWriter writer)
在 System.Text.Json.Serialization.Converters.ObjectDefaultConverter 1.OnTryWrite(Utf8JsonWriter writer, T value, JsonSerializerOptions options, WriteStack& state) at System.Text.Json.Serialization.JsonConverter1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state) 在
System.Text.Json.Serialization.Metadata.JsonPropertyInfo 1.GetMemberAndWriteJson(Object obj, WriteStack& state, Utf8JsonWriter writer) at System.Text.Json.Serialization.Converters.ObjectDefaultConverter1.OnTryWrite(Utf8JsonWriter writer, T value, JsonSerializerOptions options, WriteStack& state)
System.Text.Json.Serialization.JsonConverter 1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state) at System.Text.Json.Serialization.JsonConverter1.WriteCore(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)
在 System.Text.Json.JsonSerializer.WriteCore[TValue](Utf8JsonWriter writer, TValue& value, JsonTypeInfo 1 jsonTypeInfo) at System.Text.Json.JsonSerializer.WriteString[TValue](TValue& value, JsonTypeInfo1 jsonTypeInfo)
在 System.Text.Json.JsonSerializer.Serialize[TValue](TValue value, JsonSerializerOptions options)  

本文未出现上面的异常,只是Swagger一直LOADING,加载不出来,调试内存一直上升。 

PostgreSQL数据库表字段类型设置如下

实体配置如下

两种解决方法

方法1:基于 SqlSugar 的 ORM 将Geometry转换为其它实体方式 

PointZ实体代码如下:

public class PointZ
{
    /// <summary>
    /// 经度
    /// </summary>
    public double X { get; set; }
    /// <summary>
    /// 纬度
    /// </summary>
    public double Y { get; set; }

    /// <summary>
    /// 海拔
    /// </summary>
    public double Z { get; set; }

    public PointZ(double x = 0, double y = 0, double z = 0)
    {
        X = x;
        Y = y;
        Z = z;
    }

    public override string ToString()
    {
        return $"POINT ({X} {Y} {Z})";
    }

}

将PointZ转换为Geometry代码如下:

public SugarParameter ParameterConverter<T>(object value, int i)
{
    var name = "@PointZ" + i;
    var location = value as PointZ;
    var wkt = location != null ? $"POINT Z({location.X} {location.Y} {location.Z})" : null;
    // 设置Value为SqlGeometry类型
    Geometry geometry = null;
    if (location != null)
    {
        WKTReader reader = new WKTReader();
        // 创建一个Geometry对象(这里使用WKT表示的点)  
        geometry = reader.Read(wkt);
        geometry.SRID = 4326;
        bool bIsValid = geometry.IsValid; // Valid确保几何体是有效的
    }
    var parameter = new SugarParameter(name, geometry)
    {
        UdtTypeName = "geometry",
        CustomDbType = NpgsqlDbType.Geometry,
    };

    return parameter;
}

public T QueryConverter<T>(IDataRecord dr, int i)
{
    var str = dr.GetValue(i).ToString();
    if (string.IsNullOrWhiteSpace(str))
    {
        return default;
    }

    var parts = str.Replace("POINT Z(", "").Replace("POINT Z (", "").Replace("(", "").Replace(")", "").Split(' ');
    if (parts.Length == 3 &&
        double.TryParse(parts[0], out var x) &&
        double.TryParse(parts[1], out var y) &&
        double.TryParse(parts[2], out var z))
    {
        var location = new PointZ(x, y, z);
        return (T)(object)location;
    }
    return default;
}

本文使用此方法解决上面提到的Swagger打不开的问题。

方法2:配置JsonSerializerOptions.Converters

 var settings = new JsonSerializerOptions() 
 { 
    NumberHandling = System.Text.Json.Serialization.JsonNumberHandling.AllowNamedFloatingPointLiterals, 
    ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.Preserve, 
    MaxDepth = 100, 
 }; 
 
 settings.Converters.Add(new NetTopologySuite.IO.Converters.GeoJsonConverterFactory()); 

        添加 GeoJsonConverterFactory 是关键。它位于 NetTopologySuite.IO.GeoJSON4STJ 包中,适用于使用 System.Text.Json 序列化器。

添加NetTopologySuite.IO.GeoJSON4STJ包后,在Startup.cs中添加代码如下: 

再运行即可解决上面的异常消息。 

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

csdn_aspnet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值