可以通过定义这样的类来使用自定义转换器:
public class MyCustomConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(MyCustomType);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var ret = new MyCustomType();
return ret;
}
}
然后像这样使用它:
MyCustomType item = JsonConvert.DeserializeObject<MyCustomType>(jsonString, new MyCustomTypeConverter());
我的问题是,在处理MyCustomType
列表时如何应用此反序列化器?基本上我有一个 Json 数组 ( [{ ... }, { ... }]
),我想在数组的每个项目上使用上面的转换器来获得List<MyCustomType>
。
我知道我可以使用JArray
对象及其方法手动完成,但我想知道是否有更简单、更干净的方法来做到这一点。
下面是一个简化的上下文。
C#(我想反序列化其中的List
):
class MyCustomType
{
public Dictionary<string, string> Data
{
get;
set;
}
public int Id
{
get;
set;
}
}
JSON(数组示例中的一项):
{
"Id": 50,
"Data": [
"Hello",
"World"
]
}
C# 反序列化 我想应用:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var ret = new MyCustomType();
ret.Data = new Dictionary<string, string>();
while (reader.Read())
{
if (reader.TokenType == JsonToken.EndObject)
{
continue;
}
var value = reader.Value.ToString();
switch(value)
{
case "Id":
ret.Id = reader.ReadAsInt32().Value;
break;
case "Data":
ret.Data.Add(MySingleton.Instance.CurrentLanguage, reader.ReadAsString());
break;
}
}
return ret;
}
虽然 L.B 的答案有效,但在某些情况下确实需要转换器 - 例如,当您永远无法接触原始 JSON 并且只能归因 HTTP 请求可以访问 ASP.NET 方法时。
在这种情况下,可以使用 JsonPropertyAttribute
类并为其 ItemConverterType
属性赋值:
[JsonProperty(ItemConverterType = typeof(MyCustomConverter))]
public List<MyCustomType> Items { get; set; }
var obj = JsonConvert.DeserializeObject<MyCustomType>(json);
如果您的 JSON 是一个数组,请使用
var obj = JsonConvert.DeserializeObject<List<MyCustomType>>(json);
如果可以将Data
的类型更改为List<string>
,则甚至不需要jsonConverter
public class MyCustomType
{
public int Id { get; set; }
[JsonConverter(typeof(MyCustomConverter))]
public Dictionary<string, string> Data { get; set; }
}
public class MyCustomConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(MyCustomType);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
// read the string array and convert it to dictionary
// as declared in your MyCustomType
var arr = serializer.Deserialize<List<string>>(reader);
return arr.ToDictionary(x => x, x => x);
}
}
编辑
只需反序列化为
var yourObj = JsonConvert.DeserializeObject<MyCustomType.Rootobject>(yourjson);
public class MyCustomType
{
public class Rootobject
{
public Datum[] data { get; set; }
}
public class Datum
{
public string id { get; set; }
public string al { get; set; }
public string[] datapsi { get; set; }
public string[] tags { get; set; }
public string partype { get; set; }
public Info info { get; set; }
public Factors factors { get; set; }
public Espace[] espace { get; set; }
public Annex Annex { get; set; }
}
public class Info
{
public string nopub { get; set; }
public int nodem { get; set; }
}
public class Factors
{
public int a { get; set; }
public float b { get; set; }
public int c { get; set; }
public float d { get; set; }
public int e { get; set; }
public float f { get; set; }
public float g { get; set; }
public int h { get; set; }
public int i { get; set; }
public int j { get; set; }
public int k { get; set; }
public int l { get; set; }
public float m { get; set; }
public int n { get; set; }
public int o { get; set; }
public int p { get; set; }
public float q { get; set; }
public float r { get; set; }
public int s { get; set; }
public float t { get; set; }
}
public class Annex
{
public string name { get; set; }
public Image image { get; set; }
}
public class Espace
{
public string id { get; set; }
public string description { get; set; }
public Datatip datatip { get; set; }
public Image image { get; set; }
public string resource { get; set; }
public int delta { get; set; }
public int[] target { get; set; }
public string targetType { get; set; }
public string targetOneLined { get; set; }
public int[] alx { get; set; }
public string alxOneLined { get; set; }
public int[][] damps { get; set; }
public string[] dampsOneLined { get; set; }
public Var[] vars { get; set; }
public object misc { get; set; }
public string miscOneLined { get; set; }
}
public class Datatip
{
public string[] label { get; set; }
public string[] damps { get; set; }
}
public class Image
{
public string full { get; set; }
public string sprite { get; set; }
public string group { get; set; }
public int x { get; set; }
public int y { get; set; }
public int w { get; set; }
public int h { get; set; }
}
public class Var
{
public string key { get; set; }
public string link { get; set; }
public float coeff { get; set; }
}
}