Unity3D无法执行Newtonsoft Json代码

本文关键字:Json 代码 Newtonsoft 执行 Unity3D | 更新日期: 2023-09-27 18:12:31

我刚刚更新了我的代码加载文件的方式:

string filename = Path.Combine(Data.BaseDir, "entities.txt");
if (File.Exists(filename))
{
   string tempJson = System.IO.File.ReadAllText(filename);
   var settings = new JsonSerializerSettings()
   {
      TypeNameHandling = TypeNameHandling.Objects
   };
   IList parsedEntities = (IList)JsonConvert.DeserializeObject<List<Entity>>(tempJson, settings);
   foreach (Entity e in parsedEntities)
   {
      //e.Initialise();
      Map.Get(e.Coord).Entity = e;
   }
}

这段代码可以编译,但是在Unity 5编辑器中有一个运行时异常。(日志)这段代码恰好是常见的我的编辑器,这是一个windows窗体项目,它运行良好时,由visual studio编译。我的Newtonsoft.Json.dll显示它是版本7。

这是Unity编译器的问题吗?Newtonsoft Json DLL的某些部分是否与。net的统一版本不兼容?我该如何编写与Unity兼容的内容?

日志:

JsonSerializationException:无法加载程序集'MO1Common'。newtonsoft . json . serialize . defaultserializationbinder . gettypefromtypenamekey (TypeNameKey TypeNameKey)Newtonsoft.Json.Utilities.ThreadSafeStore 2[Newtonsoft.Json.Serialization.DefaultSerializationBinder+TypeNameKey,System.Type].AddValue (TypeNameKey key) Newtonsoft.Json.Utilities.ThreadSafeStore 2[Newtonsoft.Json.Serialization.DefaultSerializationBinder+TypeNameKey,System.Type]。获取(TypeNameKey键)Newtonsoft.Json.Serialization.DefaultSerializationBinder.BindToType(系统。字符串assemblyName, System。字符串typeName)Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ResolveTypeName (Newtonsoft.Json。JsonReader阅读器,System.Type&objectType Newtonsoft.Json.Serialization.JsonContract&Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft.Json.Serialization.JsonProperty containerMember, System。字符串qualifiedTypeName)在解析JSON 'MO1.Definitions.Entities中指定的类型时出错。特征,MO1Common’。路[0]。$type',第一行,位置57。Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ResolveTypeName (Newtonsoft.Json。JsonReader阅读器,System.Type&objectType Newtonsoft.Json.Serialization.JsonContract&Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft.Json.Serialization.JsonProperty containerMember, System。字符串qualifiedTypeName)Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadMetadataProperties (Newtonsoft.Json。JsonReader阅读器,System.Type&objectType Newtonsoft.Json.Serialization.JsonContract&Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft.Json.Serialization.JsonProperty containerMember, System。对象existingValue, System.Object&newValue System.String&id)Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject (Newtonsoft.Json。JsonReader阅读器,系统。类型objectType, newtonsoft . json . serialize . jsoncontract contract, newtonsoft . json . serialize . jsonproperty member, newtonsoft . json . serialize . jsoncontainercontract, containerContract, newtonsoft . json . serialize . jsonproperty containerMember, System。对象existingValue)Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal (Newtonsoft.Json。JsonReader阅读器,系统。类型objectType, newtonsoft . json . serialize . jsoncontract contract, newtonsoft . json . serialize . jsonproperty member, newtonsoft . json . serialize . jsoncontainercontract, containerContract, newtonsoft . json . serialize . jsonproperty containerMember, System。对象existingValue)newtonsoft . json . serializerinteralreader . populatelist (list list), Newtonsoft.Json.JsonReader阅读器,newtonsoft . json . serializerjsonarraycontract合约,newtonsoft . json . serializerjsonproperty容器属性,System。字符串id)

Unity3D无法执行Newtonsoft Json代码

我通过添加以下代码来修复这个问题:

#If Unity
tempJson = tempJson.Replace("MO1Common", "Assembly-CSharp")
#EndIf

这需要在Unity项目中添加IfDef "Unity"。

问题是Json。Net试图引用我在visual studio中设置的汇编库"MO1Common",然而,Unity将其"脚本"文件夹中的所有类编译成一个默认的汇编库,称为"assembly - csharp"。当Unity编译代码时,只需在Json字符串中替换汇编库的名称即可解决此问题。