[英]Cannot convert type 'Newtonsoft.Json.Linq.JObject' to Complex Type
[英]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.