|
|
|
@ -433,11 +433,14 @@ namespace Common.Shared.Application.SafetyFirePro.ResponseDto |
|
|
|
[JsonConverter(typeof(FlexibleCenterConverter))] |
|
|
|
[JsonConverter(typeof(FlexibleCenterConverter))] |
|
|
|
public List<List<double>> Center { get; set; } |
|
|
|
public List<List<double>> Center { get; set; } |
|
|
|
|
|
|
|
|
|
|
|
[JsonPropertyName("gaodu_x")] |
|
|
|
//[JsonPropertyName("gaodu_x")] |
|
|
|
public int GaoduX { get; set; } |
|
|
|
//public int? GaoduX { get; set; } |
|
|
|
|
|
|
|
|
|
|
|
[JsonPropertyName("gaodu_y")] |
|
|
|
//[JsonPropertyName("gaodu_y")] |
|
|
|
public int GaoduY { get; set; } |
|
|
|
//public int? GaoduY { get; set; } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[JsonPropertyName("gaodu")] |
|
|
|
|
|
|
|
public int? Gaodu { get; set; } |
|
|
|
|
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// <summary> |
|
|
|
/// 色块id |
|
|
|
/// 色块id |
|
|
|
@ -815,21 +818,76 @@ namespace Common.Shared.Application.SafetyFirePro.ResponseDto |
|
|
|
|
|
|
|
|
|
|
|
public sealed class FlexiblePointConverter : JsonConverter<PointDto> |
|
|
|
public sealed class FlexiblePointConverter : JsonConverter<PointDto> |
|
|
|
{ |
|
|
|
{ |
|
|
|
public override PointDto Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) |
|
|
|
public override PointDto Read( |
|
|
|
|
|
|
|
ref Utf8JsonReader reader, |
|
|
|
|
|
|
|
Type typeToConvert, |
|
|
|
|
|
|
|
JsonSerializerOptions options) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
// 解析JSON节点,避免直接操作reader导致位置偏移 |
|
|
|
using var doc = JsonDocument.ParseValue(ref reader); |
|
|
|
using var doc = JsonDocument.ParseValue(ref reader); |
|
|
|
var root = doc.RootElement; |
|
|
|
var root = doc.RootElement; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 1. 处理「对象格式」(如 {"x":609.5,"y":309.703125}) |
|
|
|
if (root.ValueKind == JsonValueKind.Object) |
|
|
|
if (root.ValueKind == JsonValueKind.Object) |
|
|
|
return new PointDto { X = root.GetProperty("x").GetDouble(), Y = root.GetProperty("y").GetDouble() }; |
|
|
|
{ |
|
|
|
|
|
|
|
// 兼容属性缺失的异常场景(避免崩溃,返回默认值) |
|
|
|
|
|
|
|
bool hasX = root.TryGetProperty("x", out var xElement); |
|
|
|
|
|
|
|
bool hasY = root.TryGetProperty("y", out var yElement); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (hasX && hasY && TryParseDouble(xElement, out var x) && TryParseDouble(yElement, out var y)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return new PointDto { X = x, Y = y }; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return default; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 2. 处理「数组格式」(含数字数组[338,129.203125]和字符串数组["116.079126","39.927465"]) |
|
|
|
if (root.ValueKind == JsonValueKind.Array && root.GetArrayLength() >= 2) |
|
|
|
if (root.ValueKind == JsonValueKind.Array && root.GetArrayLength() >= 2) |
|
|
|
return new PointDto { X = root[0].GetDouble(), Y = root[1].GetDouble() }; |
|
|
|
{ |
|
|
|
|
|
|
|
var xElement = root[0]; // 数组第一个元素(x值) |
|
|
|
|
|
|
|
var yElement = root[1]; // 数组第二个元素(y值) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 解析x和y(兼容数字/字符串类型) |
|
|
|
|
|
|
|
if (TryParseDouble(xElement, out var x) && TryParseDouble(yElement, out var y)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return new PointDto { X = x, Y = y }; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return default; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 3. 其他未定义格式(返回默认PointDto) |
|
|
|
return default; |
|
|
|
return default; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public override void Write(Utf8JsonWriter writer, PointDto value, JsonSerializerOptions options) |
|
|
|
public override void Write( |
|
|
|
=> writer.WriteStartObject(); // 如需写回再实现 |
|
|
|
Utf8JsonWriter writer, |
|
|
|
|
|
|
|
PointDto value, |
|
|
|
|
|
|
|
JsonSerializerOptions options) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
// 序列化时统一按「对象格式」输出(与实体类定义一致,便于后续使用) |
|
|
|
|
|
|
|
writer.WriteStartObject(); |
|
|
|
|
|
|
|
writer.WriteNumber("x", value.X); |
|
|
|
|
|
|
|
writer.WriteNumber("y", value.Y); |
|
|
|
|
|
|
|
writer.WriteEndObject(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region 私有辅助方法:统一处理JsonElement(数字/字符串)转double |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
|
|
|
|
/// 兼容「数字类型」和「字符串类型」的JsonElement,解析为double |
|
|
|
|
|
|
|
/// 例:116.079126 → 116.079126;"116.079126" → 116.079126 |
|
|
|
|
|
|
|
/// </summary> |
|
|
|
|
|
|
|
private bool TryParseDouble(JsonElement element, out double result) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return element.ValueKind switch |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
// 若元素是数字,直接获取double |
|
|
|
|
|
|
|
JsonValueKind.Number => element.TryGetDouble(out result), |
|
|
|
|
|
|
|
// 若元素是字符串,尝试解析为double |
|
|
|
|
|
|
|
JsonValueKind.String => double.TryParse(element.GetString(), out result), |
|
|
|
|
|
|
|
// 其他类型(如布尔值),解析失败 |
|
|
|
|
|
|
|
_ => (result = 0, false).Item2 |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
#endregion |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |