C# 类型为'的对象;Newtonsoft.Json.Linq.JObject';无法转换为类型

C# 类型为'的对象;Newtonsoft.Json.Linq.JObject';无法转换为类型,c#,json,xna,json.net,C#,Json,Xna,Json.net,我正在使用JSON.NET使用反射将一些数据解析为某些特定属性 property.SetValue(comInstance,field.Value) 在这一行中,它抛出一个ArgumentException: mscorlib.dll中发生类型为“System.ArgumentException”的未处理异常 其他信息:“Newtonsoft.Json.Linq.JObject”类型的对象无法转换为“Microsoft.Xna.Framework.Vector2”类型 我知道这一定与我的Json

我正在使用JSON.NET使用反射将一些数据解析为某些特定属性

property.SetValue(comInstance,field.Value)

在这一行中,它抛出一个
ArgumentException

mscorlib.dll中发生类型为“System.ArgumentException”的未处理异常

其他信息:“Newtonsoft.Json.Linq.JObject”类型的对象无法转换为“Microsoft.Xna.Framework.Vector2”类型

我知道这一定与我的
JsonConverter
for
Vector2
类型有关,它看起来像这样:

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();
        
    }
}
JsonConvert.DeserializeObject<EntityJson>(json, JsonUtility.Settings);
JsonConvert.SerializeObject(entityJson, Formatting.Indented, JsonUtility.Settings);
现在,我注意到write被调用,但read从来没有调用过。 我反序列化如下:

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();
        
    }
}
JsonConvert.DeserializeObject<EntityJson>(json, JsonUtility.Settings);
JsonConvert.SerializeObject(entityJson, Formatting.Indented, JsonUtility.Settings);
JSON中的字段本身看起来也不错:

"Center": {
      "X": 116.0,
      "Y": 65.0
    },
有人能帮我吗

编辑:

内部类EntityJson
{
公共字符串名称{get;set;}
公共字典组件{get;set;}
公共实体JSON()
{
组件=新字典();
}
公共实体实体实体()
{
实体=新实体(名称);
foreach(组件中的KeyValuePair com)
{
ObjectHandle=Activator.CreateInstance(com.Value.Namespace,com.Value.Namespace+“+”+com.Key);
对象handleValue=handle.Unwrap();
组件comInstance=(组件)handleValue;
foreach(com.Value.Fields中的KeyValuePair字段)
{
PropertyInfo property=comInstance.GetType().GetProperty(field.Key,
BindingFlags.NonPublic|
BindingFlags.Public|
BindingFlags.Instance);

property.SetValue(comInstance,field.Value);//好的,我通过以下方法解决了它:

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); 

这是一个稳定的解决方案吗?

JSON转换器是否引发异常?我没有看到代码
property.SetValue(comInstance,field.Value)行;
转换器中的任意位置。您的
EntityJson
类是什么样子的?该类中Vector2的属性名是否与正在反序列化的JSON中的属性名匹配?您需要向我们显示
property.SetValue(comInstance,field.Value)所在的代码;
被调用。但是如果
field.Value
是一个
JObject
,并且您在某个更高级别的JSON转换器中,您需要将其转换为目标类型,例如,我的EntityJson就是这样的:如果您试图将JSON片段应用于一个预先存在的对象,那么您可以使用并让JSON.NET进行反射或者你。“这是一个稳定的解决方案吗?”-这可以说是一个新的解决方案question@MickyDuncan:还有一个听起来更接近于此的。@Nathantugy Thx Nathan,不知道那个子站点哦,对不起,我在这里问的第一个问题可能是我是否记得正确。我会记住的,谢谢。