使用注释使用Json.NET将嵌套的JSON结构反序列化为展平类

是否可以使用JsonProperty批注将嵌套的Json属性映射到非嵌套的.NET成员? 假设你有一些这样的Json:

{ "id":9999, "created_date":"Thu, 23 Jun 2011 12:56:24 +0000", "pos":{ "type":"someType", "coordinates":[ 59.323, 18.0654 ] } } 

并希望将其反序列化为扁平类MyClass使用

 JsonConvert.DeserializeObject(jsonstr); 

可以使用注释将Json坐标列表映射到下面的类中的Lat和Lng:

 public class MyClass { [JsonProperty("id")] public int Id { get; set; } [JsonProperty("created_date")] public DateTime Created { get; set; } [JsonProperty("????")] public float Lat { get; set; } [JsonProperty("?????")] public float Lng { get; set; } } 

只是好奇。 我总是可以像这样定义类,它似乎工作正常:

 public class MyClass { [JsonProperty("id")] public int Id { get; set; } [JsonProperty("date_created")] public DateTime Created { get; set; } [JsonProperty("pos")] public PosClass Pos { get; set; } } public class PosClass { public List coordinates { get; set; } } 

从个人经验来看,我在尝试重新使用我的实体进行通信(JSON,XML ……等)之前一直在努力,但在密切关注现有模式之后,我发现除了内部/之外还有“数据传输对象”您已经拥有的存储实体将解放我的通信模型,我付出的唯一代价就是接受手动,但直接,两者之间手动编码转换的努力。

如果您更愿意坚持自己所拥有的并且性能没什么大不了的话,那么.NETreflection就是您的朋友。

对于非常复杂的JSON情况,我非常喜欢Demis Bellot使用ServiceStack.Text的手动映射方法。 这允许我将httpResponse.Content传递给JsonConverter.Convert(字符串json)方法。

这样做的另一个好处是可以保持模型对象的干净。

 var place = JsonObject.Parse(JsonCentroid) .Object("place") .ConvertTo(x => new Place { WoeId = x.Get("woeid"), PlaceTypeName = x.Get(""), PlaceTypeNameAttrs = x.Object("placeTypeName attrs"), Name = x.Get("Name"), BoundingBox = x.Object("boundingBox") .ConvertTo(y => new BoundingBox { SouthWest = y.Object("southWest").ConvertTo(toCentroid), NorthEast = y.Object("northEast").ConvertTo(toCentroid) }), }); 

你可以在这里看到完整的测试。

我认为如果你根本不打算它会更好。 为什么不这样做有很多原因:

  1. 如果在某些时候你将需要具有相同名称的字段。
  2. 如果您想更改属性,则必须从头开始重建JSON对象。

最好的选择是阅读一些关于使用JSon进行数据爬行的内容 – 这里 。 非常简单实用。

之后 – 如果你仍然坚持,你可以将它包装在一个不错的新课程中。