簡體   English   中英

目標是抽象對象時的Json.net反序列化問題

[英]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"]
}

使用簡單類型(例如, stringslongint等)沒有問題。
當我收到一個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/

如果key3string值的JArray ,則可以執行以下操作:

List<string> strs = ((JArray)values["key3"]).Select(t => t.Value<string>()).ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM