簡體   English   中英

'Newtonsoft.Json.Linq.JObject' 類型的對象無法轉換為類型

[英]Object of type 'Newtonsoft.Json.Linq.JObject' cannot be converted to type

我正在使用 JSON.NET 使用反射將一些數據解析為某些特定屬性。

property.SetValue(comInstance, field.Value);

這一行它拋出一個ArgumentException

mscorlib.dll 中發生類型為“System.ArgumentException”的未處理異常

附加信息:“Newtonsoft.Json.Linq.JObject”類型的對象無法轉換為“Microsoft.Xna.Framework.Vector2”類型。

我知道這一定與我的Vector2類型的JsonConverter有關,它看起來像這樣:

public class Vector2Converter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(Vector2));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jsonObject = JObject.Load(reader);
        var properties = jsonObject.Properties().ToList();
        return new Vector2
        {
            X = (float)properties[0].Value,
            Y = (float)properties[1].Value
        };
    }
    
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        Vector2 v = (Vector2)value;
        writer.WriteStartObject();
        writer.WritePropertyName("X");
        serializer.Serialize(writer, v.X);
        writer.WritePropertyName("Y");
        serializer.Serialize(writer, v.Y);
        writer.WriteEndObject();
        
    }
}

現在,我注意到 write 被調用,但 read 從來沒有。 我這樣反序列化:

JsonConvert.DeserializeObject<EntityJson>(json, JsonUtility.Settings);

JsonUility.Settings包含Vector2Converter

我像這樣序列化:

JsonConvert.SerializeObject(entityJson, Formatting.Indented, JsonUtility.Settings);

JSON 本身的字段看起來也不錯:

"Center": {
      "X": 116.0,
      "Y": 65.0
    },

誰能幫我嗎?

編輯:

internal class EntityJson
{
    public string Name { get; set; }
    public Dictionary<string, ComponentJson> Components { get; set; }
    
    public EntityJson()
    {
        Components = new Dictionary<string, ComponentJson>();
    }

    public Entity ToEntity()
    {
        Entity entity = new Entity(Name);

        foreach(KeyValuePair<string, ComponentJson> com in Components)
        {
            ObjectHandle handle = Activator.CreateInstance(com.Value.Namespace, com.Value.Namespace +"."+ com.Key);
            Object handleValue = handle.Unwrap();
            Component comInstance = (Component)handleValue;

            foreach(KeyValuePair<string, object> field in com.Value.Fields)
            {
                PropertyInfo property = comInstance.GetType().GetProperty(field.Key, 
                    BindingFlags.NonPublic | 
                    BindingFlags.Public | 
                    BindingFlags.Instance);

                property.SetValue(comInstance, field.Value); // <-- field.Value
            }

            entity.AddUnsafe(comInstance);
        }

        return entity;
    }
}

field.value 將是JObject而不是Vector2 ,異常狀態:

它不能被鑄造。

好的,我設法解決它這樣做:

object result = field.Value;
if (field.Value.GetType() == typeof(JObject))
{
      JToken token = (JToken)field.Value;
      result = token.ToObject(property.PropertyType, JsonSerializer.Create(JsonUtility.Settings));
}
else
{
      result = Convert.ChangeType(result, property.PropertyType);
}

property.SetValue(comInstance, result); 

這是一個穩定的解決方案嗎?

暫無
暫無

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

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