直接反序列化JSON中的嵌套元素



假设我有以下JSON:

{
  id: 123,
  attr: {
    info: {
      dat: [{data:1}, {data:2}]
    }
  }
}

是否可以在不创建attrinfo的嵌套层次结构的情况下,取消整个对象的序列化,但直接获得dat数组?

我试过使用(幼稚的)

public class DataContainer {
    [JsonProperty(PropertyName = "id")]
    public int ID { get; set; }
    [JsonProperty(PropertyName = "attr.info.dat")]
    public List<dat> Data { get; set; }
}

但无济于事。

另一个显而易见的解决方案当然是创建一个没有层次结构的单独类,解析JSON,然后将所需的数据复制到一个新对象。我目前使用这种方法,但如果可以直接解析到所需的结构,那就太好了。

实现这一点的快速方法是使用Json.Net的Linq-to-Json API。假设你的类是这样定义的:

public class DataContainer
{
    public int ID { get; set; }
    public List<Dat> Data { get; set; }
}
public class Dat
{
    public int Data { get; set; }
}

然后,您可以将JSON反序列化为类结构,如下所示:

string json = @"{
  ""id"": 123,
  ""attr"": {
    ""info"": {
      ""dat"": [{""data"":1}, {""data"":2}]
    }
  }
}";
JObject jo = JObject.Parse(json);
DataContainer container = new DataContainer();
container.ID = jo["id"].Value<int>();
container.Data = jo["attr"]["info"]["dat"].ToObject<List<Dat>>();
Console.WriteLine("id:" + container.ID);
foreach (Dat d in container.Data)
{
    Console.WriteLine(d.Data);
}

输出:

id:123
1
2

一个稍微稳健一点的解决方案是将上面的代码放入一个自定义的JsonConverter中,然后可以与JsonConvert.DeserializeObject()一起使用。这封装了反序列化逻辑,使主代码更加简洁。以下是转换器的代码。(请注意,我也实现了WriteJson方法,但您并不真正需要它,除非您想将类序列化回JSON。)

public class DataContainerConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(DataContainer));
    }
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jo = JObject.Load(reader);
        DataContainer container = new DataContainer();
        container.ID = jo["id"].Value<int>();
        container.Data = jo["attr"]["info"]["dat"].ToObject<List<Dat>>(serializer);
        return container;
    }
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        DataContainer container = (DataContainer)value;
        JObject jo = new JObject();
        jo.Add("id", container.ID);
        JObject attr = new JObject();
        jo.Add("attr", attr);
        JObject info = new JObject();
        attr.Add("info", info);
        JArray dat = JArray.FromObject(container.Data, serializer);
        info.Add("dat", dat);
        jo.WriteTo(writer);
    }
}

您可以通过用[JsonConverter]属性装饰类来使用JsonConverter:

[JsonConverter(typeof(DataContainerConverter))]
public class DataContainer
{
    public int ID { get; set; }
    public List<Dat> Data { get; set; }
}

或者通过将其实例传递给JsonConvert.DeserializeObject():

var container = JsonConvert.DeserializeObject<DataContainer>(json, new DataContainerConverter());

尝试这个

如果要将Json字符串转换为类,请使用http://json2csharp.com/然后按照代码。。。它对我来说很好

public class Dat
{
public int data { get; set; }
}
 public class Info
 {
  public List<Dat> dat { get; set; }
 }
public class Attr
{
 public Info info { get; set; }
}
 public class RootObject
 {
   public int id { get; set; }
  public Attr attr { get; set; }
 }

 string sValue = "{id: 123,attr: {info: {dat: [{data:1}, {data:2}]}}}";
        System.Web.Script.Serialization.JavaScriptSerializer ObjJSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
        var Data = ObjJSerializer.Deserialize<RootObject>(sValue);

相关内容

  • 没有找到相关文章

最新更新