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

时间:2011-06-24 00:36:25

标签: c# asp.net json json.net

是否可以使用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<MyClass>(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<float> coordinates { get; set; }
}

3 个答案:

答案 0 :(得分:1)

从个人经验来看,我在尝试重新使用我的实体进行通信(JSON,XML ......等)之前一直在努力,但在密切关注现有模式之后,我发现另外还有"data transfer objects"你已经拥有的内部/存储实体将解放我的通信模型,而我付出的唯一代价就是接受手动,但直接,两者之间手动编码转换的努力。

如果你坚持自己拥有的东西并且表现没什么大不了的话,那么.NET反思就是你的朋友。

答案 1 :(得分:0)

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

这样可以保持模型对象的干净清晰。

var place = JsonObject.Parse(JsonCentroid)
.Object("place")
.ConvertTo(x => new Place
{
    WoeId = x.Get<int>("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)
            }),
});

您可以看到完整的测试here

答案 2 :(得分:0)

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

  1. 如果在某些时候你必须使用相同名称的字段。
  2. 如果您想更改属性,则必须重建JSON对象 从头开始。
  3. 最好的选择是阅读一些关于使用JSon进行数据爬网的内容 - here。 非常简单实用。

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