3 回答

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊
與其嘗試更改反序列化邏輯,不如不讓它變得更簡(jiǎn)單,而僅在模型中包含一個(gè)新屬性?
public string Description{ get; set; }
public int Category { get; set; }
//Change this back to string, since that is what your JSON is
public string Target{ get; set; }
//Add a "TargetList" property that just reads from "Target" and turns into a List
public List<int> TargetList => Target.Split(',').Select(x => int.Parse(x)).ToList();
請(qǐng)注意,我的代碼中沒(méi)有錯(cuò)誤處理,因此您將必須進(jìn)行相應(yīng)的修改。

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超18個(gè)贊
Target字段在json中為字符串類(lèi)型,因此序列化程序?qū)L試將其讀取為字符串。您可以使用轉(zhuǎn)換器來(lái)推翻它,例如使用Newtonsoft Json。
假設(shè)您的數(shù)據(jù)結(jié)構(gòu)定義如下:
public class Data {
public string Description{ get; set; }
public ICollection<int> Target{ get; set; }
public int Category { get; set; }
}
然后,您可以創(chuàng)建自己的JsonConverter,如下所示:
public class DataConverter : JsonConverter {
public override bool CanWrite => false;
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 jObject = JObject.Load(reader);
var data = new Data();
if (jObject.TryGetValue("Description", out JToken jDescription)) {
data.Description = jDescription.Value<string>();
}
if (jObject.TryGetValue("Target", out JToken jTarget)) {
data.Target = ToTarget(jTarget, serializer);
}
if (jObject.TryGetValue("Category", out JToken jCategory)) {
data.Category = jCategory.Value<int>();
}
return req;
}
private static ICollection<int> ToTarget( JToken jTarget, JsonSerializer serializer ) {
int defaultValue = -1;
var target = new List<int>();
var collection = jTarget.Value<string>().Split(',');
foreach (string str in collection)
if (int.TryParse(str, out int number))
target.Add(number);
else
target.Add(defaultValue);
return target;
}
public override bool CanConvert(Type objectType) => objectType == typeof(Data);
}
然后,您可以使用以下代碼反序列化:
var jsonSettings = new JsonSerializerSettings();
jsonSettings.Converters.Add(new DataConverter);
Data data = JsonConvert.DeserializeObject<Data>(yourJsonString, jsonSettings);
進(jìn)一步考慮:這種方法可以使您的數(shù)據(jù)定義和數(shù)據(jù)解析邏輯之間清楚地分開(kāi),從而使您的數(shù)據(jù)結(jié)構(gòu)和定義與任何json特定的信息和解析邏輯保持清晰。
- 3 回答
- 0 關(guān)注
- 280 瀏覽
添加回答
舉報(bào)