C# 带有NetTopologySuite.IO.GeoJSON的JsonConvert.DeserializeObject具有异常预期标记';}';找不到
我有以下数据传输对象C# 带有NetTopologySuite.IO.GeoJSON的JsonConvert.DeserializeObject具有异常预期标记';}';找不到,c#,json,C#,Json,我有以下数据传输对象 [DataContract] public class Entity : IEntity { /// <summary> /// /// </summary> public Entity() { } /// <summary> /// /// /// /// </s
[DataContract]
public class Entity : IEntity
{
/// <summary>
///
/// </summary>
public Entity() { }
/// <summary>
///
///
///
/// </summary>
[DataMember]
[JsonPropertyName("ENAME")]
[Display(Name = "ENAME")]
public string ENAME { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("ENTITY_DEF_I_EID")]
[Display(Name = "Entity Def EID")]
public int ENTITY_DEF_I_EID { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("I_SID")]
[Display(Name = "Server ID")]
public int I_SID { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("I_EID")]
[Display(Name = "Entity ID")]
public int I_EID { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("F_DELETED")]
[Display(Name = "Deleted")]
public string F_DELETED { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("S_LAST_MOD_INFO")]
[Display(Name = "Last Modified Into")]
public string S_LAST_MOD_INFO { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("CUSTOM1")]
[Display(Name = "Custom 1")]
public string CUSTOM1 { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("CUSTOM2")]
[Display(Name = "Custom 2")]
public string CUSTOM2 { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("CUSTOM3")]
[Display(Name = "Custom 3")]
public string CUSTOM3 { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("CUSTOM4")]
[Display(Name = "Custom 4")]
public string CUSTOM4 { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("CUSTOM5")]
[Display(Name = "Custom 5")]
public string CUSTOM5 { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("CUSTOM6")]
[Display(Name = "Custom 6")]
public string CUSTOM6 { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("CUSTOM7")]
[Display(Name = "Custom 7")]
public string CUSTOM7 { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("CUSTOM8")]
[Display(Name = "Custom 8")]
public string CUSTOM8 { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("CUSTOM9")]
[Display(Name = "Custom 9")]
public string CUSTOM9 { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("CUSTOM10")]
[Display(Name = "Custom 10")]
public string CUSTOM10 { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("RESV1")]
[Display(Name = "Reserved 1")]
public string RESV1 { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("RESV2")]
[Display(Name = "Reserved 2")]
public string RESV2 { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("RESV3")]
[Display(Name = "Reserved 3")]
public string RESV3 { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("RESV4")]
[Display(Name = "Reserved 4")]
public string RESV4 { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("RESV5")]
[Display(Name = "Reserved 5")]
public string RESV5 { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("FEATURE_DEF_NAME")]
[Display(Name = "Feature Def Name")]
public string FEATURE_DEF_NAME { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("PHOTO")]
[Display(Name = "Photo")]
public string PHOTO { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("DETAIL")]
[Display(Name = "Detail")]
public string DETAIL { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("DOCUMENT")]
[Display(Name = "Document")]
public string DOCUMENT { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("ACAD_COLOR")]
[Display(Name = "Acad Color")]
public decimal ACAD_COLOR { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("ACAD_LAYER")]
[Display(Name = "Layer")]
public string ACAD_LAYER { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("ATT_BLK")]
[Display(Name = "Attribute Block")]
public string ATT_BLK { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("ATT_LAY")]
[Display(Name = "Attribute Layer")]
public string ATT_LAY { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("TAG_ROT")]
[Display(Name = "Tag Rotation")]
public decimal TAG_ROT { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("X_COORD")]
[Display(Name = "X Coordinate")]
public decimal X_COORD { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("Y_COORD")]
[Display(Name = "Y Coordinate")]
public decimal Y_COORD { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
[JsonPropertyName("Z_COORD")]
[Display(Name = "Z Coordinate")]
public decimal Z_COORD { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
//[JsonPropertyName("GEOM")]
//[JsonProperty(PropertyName = "GEOM", ItemConverterType = typeof(GeometryConverter))]
[Newtonsoft.Json.JsonConverter(typeof(GeometryConverter))]
[Display(Name = "Geometry")]
public Geometry GEOM { get; set; }
}
当ActionResult返回给客户机时,以下方法就是异常发生的地方
Private Function GetReturnList(ByVal objects As String) As IEnumerable(Of Entity)
Dim _listReturn As IEnumerable(Of Entity)
Dim _listEntity As List(Of Entity) = New List(Of Entity)
Dim settings As JsonSerializerSettings = New JsonSerializerSettings()
settings.TypeNameHandling = TypeNameHandling.Auto
settings.NullValueHandling = NullValueHandling.Ignore
If Not IsNothing(objects) Then
_listEntity = JsonConvert.DeserializeObject(Of List(Of Entity))(objects, settings).AsEnumerable()
Dim obj As Entity = _listEntity(0)
Select Case obj.FEATURE_DEF_NAME
Case "CO", "REMOTE_CO"
_listReturn = JsonConvert.DeserializeObject(Of List(Of CT_CO))(objects, settings).Cast(Of Entity).AsEnumerable()
Case "NETWORK_INTERFACE", "STATION_PROTECTOR"
_listReturn = JsonConvert.DeserializeObject(Of List(Of CT_SBFAC))(objects, settings).Cast(Of Entity).AsEnumerable()
Case "WORKORDER"
_listReturn = JsonConvert.DeserializeObject(Of List(Of CT_WORKS))(objects, settings).Cast(Of Entity).AsEnumerable()
Case "CUSTOMER"
_listReturn = JsonConvert.DeserializeObject(Of List(Of CUSTOMER))(objects, settings).Cast(Of Entity).AsEnumerable()
Case "FIBERS"
_listReturn = JsonConvert.DeserializeObject(Of List(Of FIBERS))(objects, settings).Cast(Of Entity).AsEnumerable()
Case "FIBER_SPLITTER"
_listReturn = JsonConvert.DeserializeObject(Of List(Of FO_SPLITTER))(objects, settings).Cast(Of Entity).AsEnumerable()
End Select
End If
Return _listReturn
End Function
当我尝试反序列化下一行上的json字符串对象时会出现异常:
_listEntity=JsonConvert.DeserializeObject(实体的列表))(对象、设置).AsEnumerable()
异常消息未找到预期的令牌“}”。
下面是抛出的异常的堆栈跟踪
at NetTopologySuite.IO.Converters.GeometryConverter.ParseGeometry(JsonReader reader, JsonSerializer serializer)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.DeserializeConvertable(JsonConverter converter, JsonReader reader, Type objectType, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IList list, JsonReader reader, JsonArrayContract contract, JsonProperty containerProperty, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
at CtPortalServices.Queries.Handler.GetLocateFeaturesQueryHandler.GetReturnList(String objects) in C:\Development\Matador\Spatial E-Suite\11.0\Clients\Commander\CtPortalServices\Domain\Queries\Handler\Locate\GetLocateFeaturesQueryHandler.vb:line 108
at CtPortalServices.Queries.Handler.GetLocateFeaturesQueryHandler.GetReturnObject(IRestResponse response) in C:\Development\Matador\Spatial E-Suite\11.0\Clients\Commander\CtPortalServices\Domain\Queries\Handler\Locate\GetLocateFeaturesQueryHandler.vb:line 90
at CtPortalServices.Queries.QueryHandler.Get() in C:\Development\Matador\Spatial E-Suite\11.0\Clients\Commander\CtPortalServices\Domain\Queries\QueryHandler.vb:line 237
有人能告诉我如何解决这个问题吗
提前谢谢你 您的GeoJSON格式不正确,或者您正试图使用GeoJSON转换器转换非GeoJSON格式的数据 根据第3.1节,坐标属性的值不应是对象,而应是数组。比如说,
“坐标”:{
“m”:0.0,
“z”:0.0,
“x”:-156.3413802,
“y”:20.725685900000003
}
应该是
“坐标”:[-156.3413802,20.725685900000003,0.0]
(我不确定如何处理m
值,但在两个采样点中它都是零,所以我希望可以忽略它。)
RFC包含GeoJSON的更多示例
我不知道您是否有能力更改返回到RESTAPI的坐标,但如果没有,您可能需要以其他方式解析JSON
遗憾的是,NetTopologySuite GeoJson转换器似乎并不擅长处理这种情况。一旦它开始处理第一个坐标
属性,它似乎会一直处理JSON标记,直到它到达JSON数据末尾的数组结束字符。以下是修复我的反序列化对象问题的方法
它与默认序列化程序处理单个几何体类型的方式有关
我在ConfigureServices方法中添加了以下代码
services.AddControllers(options => {
options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(Point)));
options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(Coordinate)));
options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(LineString)));
options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(MultiLineString)));
}).AddNewtonsoftJson(options => {
foreach (var converter in NetTopologySuite.IO.GeoJsonSerializer.Create(new GeometryFactory(new PrecisionModel(), 4326)).Converters)
{
options.SerializerSettings.Converters.Add(converter);
}
}).SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
现在,客户端的JSON字符串格式良好,坐标形式正确
"geom": {
"type": "Point",
"coordinates": [
-157.09853,
21.1574725
]
}
所有这些代码真的相关吗?请把你的代码压缩成一个简单的格式。欢迎来到堆栈溢出@user2864740:如果在JSON数据的开头添加一个[
,在结尾添加一个]
,从而使其成为有效的JSON数组,则可以重现OP得到的错误。如果没有它们,您将收到不同的错误消息。我假设这只是写问题时的一个失误,而不是数据问题。整个问题都是基于无效JSON引发的异常。假设包含的数据不相关。嗨,卢克。。。。谢谢你的回复。在阅读了您的回复后,我开始查看数据是如何序列化的!!我没有为GeoJsonSerializer中的单个几何体类型添加转换器!我真的怀疑这是原始问题,因为例外包含“}”。关闭大括号仅在关闭对象时才需要,因此与“查找对象而不是数组”无关,这可能会导致不同的异常。
services.AddControllers(options => {
options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(Point)));
options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(Coordinate)));
options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(LineString)));
options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(MultiLineString)));
}).AddNewtonsoftJson(options => {
foreach (var converter in NetTopologySuite.IO.GeoJsonSerializer.Create(new GeometryFactory(new PrecisionModel(), 4326)).Converters)
{
options.SerializerSettings.Converters.Add(converter);
}
}).SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
"geom": {
"type": "Point",
"coordinates": [
-157.09853,
21.1574725
]
}