【发布时间】:2020-07-24 16:11:20
【问题描述】:
我正在使用 Azure 定位服务来检索某些位置。我返回的 Json 是一个像这样填充的对象数组(出于隐私考虑,省略了数据):
{
"Id": "",
"Name": "",
"Address": "",
"PostCode": "",
"Location": {
"Latitude": 123
"Longitude": -123,
"IsEmpty": false,
"Z": null,
"M": null,
"CoordinateSystem": {
"EpsgId": 123,
"Id": "123",
"Name": "ABC"
}
}
},
我正在尝试反序列化为一个 LookUpModel 对象,该对象的位置具有 Microsoft.Spatial.Geography 点:
public GeographyPoint Location { get; set; }
当我使用默认的 newtonsoft json 反序列化器时,我收到以下错误:“无法创建 Microsoft.Spatial.GeographyPoint 类型的实例。类型是接口或抽象类,无法实例化。路径'[0]。 Location.Latitude',第 11 行,第 17 位。”
因此,我正在尝试创建一个自定义的 Json Deserializer,它将创建一个 GeographyPoint(每当点击位置节点时使用 GeographyPoint.Create(Longitude = x, Latitude = y)。到目前为止,我有:
public class GeographyPointJsonConverter : JsonConverter
{
private readonly Type[] _types;
public GeographyPointJsonConverter(params Type[] types)
{
_types = types;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
JToken t = JToken.FromObject(value);
if (t.Type != JTokenType.Object)
{
t.WriteTo(writer);
}
else
{
JObject o = (JObject)t;
IList<string> propertyNames = o.Properties().Select(p => p.Name).ToList();
o.AddFirst(new JProperty("Keys", new JArray(propertyNames)));
o.WriteTo(writer);
}
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter.");
}
public override bool CanRead
{
get { return false; }
}
public override bool CanConvert(Type objectType)
{
return _types.Any(t => t == typeof(GeographyPoint));
}
}
被调用: var jsonData = JsonConvert.DeserializeObject<LookUpModel[]>(json, new GeographyPointJsonConverter(typeof(LookUpModel[])));
但是我不知道如何成功地将位置信息反序列化为GeographyPoint?请问有人能指出我正确的方向吗?
【问题讨论】: