假设我有以下JSON:
{
id: 123,
attr: {
info: {
dat: [{data:1}, {data:2}]
}
}
}
是否可以在不创建attr
和info
的嵌套层次结构的情况下,取消整个对象的序列化,但直接获得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);