反序列化具有不一致属性的JSON



我想将JSON反序列化为C#中的对象

但其中一个特性可以是

List<double>List<List<double>>List<List<List<double>>>>

这取决于的另一个特性

如何做到这一点?

[JsonProperty("type")]
public string Type { get; set; }
[JsonProperty("coordinates")]
public List<double> Coordinates { get; set; }

如果Type = X -> Coordinates = List<double>

如果Type = Y -> Coordinates = List<List<double>>

我能够根据您的问题快速编译一段代码。所以你知道,我用Newtonsoft来写它,因为我已经有了一个样本,我需要为你的使用做一些修改。

//Classes
class TypeBase
{
[JsonProperty("type")]
public string Type { get; set; }
}
class TypeX : TypeBase
{
[JsonProperty("coordinates")]
public List<double> Coordinates { get; set; }
}
class TypeY : TypeBase
{
[JsonProperty("coordinates")]
public List<List<double>> Coordinates { get; set; }
}

以下是您需要的自定义JsonConverter

public class DataObjectConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(TypeX) || objectType == typeof(TypeY) || objectType == typeof(TypeBase);
}
public override bool CanRead => true;
public override bool CanWrite => false;
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
return null;
var obj = JObject.Load(reader);
var dataType = obj.Property("type", StringComparison.InvariantCultureIgnoreCase);
if ("X".Equals(dataType?.Value.ToString(), StringComparison.InvariantCultureIgnoreCase))
{
return obj?.ToObject<TypeX>();
}
if ("Y".Equals(dataType?.Value.ToString(), StringComparison.InvariantCultureIgnoreCase))
{
return obj?.ToObject<TypeY>();
}
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}

最后,这里是关于如何使用整个东西的代码:

var serializerSettings = new JsonSerializerSettings();
serializerSettings.Converters.Add(new DataObjectConverter());
var typeX = JsonConvert.DeserializeObject<TypeBase>(t, serializerSettings);
var typeY = JsonConvert.DeserializeObject<TypeBase>(ty, serializerSettings);
if (typeX.Type == "X")
{
var typeXObj = (TypeX)typeX;
Console.WriteLine(typeXObj.Coordinates.Count);
}
//etc.

相关内容

  • 没有找到相关文章

最新更新