[英]Json.net deserialization issue when target is an abstract object
我正在使用返回json
的服務。
我有一個鍵值對象,其中鍵是一個string
,值是一個object
並且我知道根據鍵將對象投射到哪里。
它看起來像:
{
"key1": "This is key 1",
"key2": 12,
"key3": ["Key 3 first item", "Key 3 second item"]
}
使用簡單類型(例如, strings
, long
, int
等)沒有問題。
當我收到一個array
(key3)時,我的問題就開始了。
我的C#代碼如下所示:
Dictionary<string, object> values = GetValuesFromTheService();
string str = (string)values["key1"]; // Ok
long lng = (long)values["key2"]; // Ok
List<string> strs = (List<string>)values["key3"]; // BAD
key3實際上是一個JArray
而不是一個List<string>
-我猜這是因為我使用一個object
作為值而不是更具體( List<object>
也會比JArray
更好)。
有什么我可以做的嗎?
您應該能夠將整個對象解析為一個jObject,然后選擇返回所需類型的鍵。 這是未經測試但基本的想法。
var j = JObject.Parse(GetValuesFromTheService());
string str = (string)j.SelectToken("key1");
long lng = (long)j.SelectToken("key2");
var strs = (List<string>)j.SelectToken("key3");
在嘗試對一些自定義枚舉進行反序列化時,我遇到類似的情況。 對於該解決方案,我創建了一個自定義JsonConvertor。 這是我用於此的代碼...
public class EnumerationConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var enm = (Enumeration)value;
writer.WriteValue(enm.Value);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.Value == null)
{
return null;
}
int value;
if (reader.ValueType == typeof(Int64))
{
value = Convert.ToInt32(reader.Value);
}
else
{
value = (int)reader.Value;
}
return Enumeration.FromValueOrDefault(objectType, value);
}
public override bool CanConvert(Type objectType)
{
if (objectType.BaseType == null) return false;
return objectType.BaseType.Name == "Enumeration";
}
}
然后,當我想調用它並將json拉回到我的對象中時,這是該行的代碼...
JsonConvert.DeserializeObject<List<CustomObjectDto>>(req.Content.ReadAsStringAsync().Result, new EnumerationConverter());
令人高興的是,它變得普遍可用,並且CustomObjectDto可以僅在其中包含此魔術字典的一個實例作為屬性...甚至多個...,並將轉換僅應用於根據中的邏輯匹配的屬性轉換器...希望有幫助。
這是指向類似主題的鏈接-> http://blog.maskalik.com/asp-net/json-net-implement-custom-serialization/
如果key3
是string
值的JArray
,則可以執行以下操作:
List<string> strs = ((JArray)values["key3"]).Select(t => t.Value<string>()).ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.