Unity3D无法执行Newtonsoft Json代码

时间:2015-09-13 23:53:10

标签: c# json unity3d

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

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的unities版本不兼容? 我该怎么写这个与Unity兼容?

日志:

  

JsonSerializationException:无法加载程序集&#39; MO1Common&#39;。   Newtonsoft.Json.Serialization.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] .Get(TypeNameKey key)   Newtonsoft.Json.Serialization.DefaultSerializationBinder.BindToType(System.String assemblyName,System.String typeName)   Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ResolveTypeName(Newtonsoft.Json.JsonReader reader,System.Type&amp; objectType,Newtonsoft.Json.Serialization.JsonContract&amp; contract,Newtonsoft.Json.Serialization.JsonProperty member,Newtonsoft.Json.Serialization.JsonContainerContract containerContract ,Newtonsoft.Json.Serialization.JsonProperty containerMember,System.String qualifiedTypeName)   Rethrow as JsonSerializationException:在JSON&#39; MO1.Definitions.Entities.Charactor,MO1Common&#39;中指定的错误解析类型。路径&#39; [0]。$ type&#39;,第1行,第57位。   Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ResolveTypeName(Newtonsoft.Json.JsonReader reader,System.Type&amp; objectType,Newtonsoft.Json.Serialization.JsonContract&amp; contract,Newtonsoft.Json.Serialization.JsonProperty member,Newtonsoft.Json.Serialization.JsonContainerContract containerContract ,Newtonsoft.Json.Serialization.JsonProperty containerMember,System.String qualifiedTypeName)   Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadMetadataProperties(Newtonsoft.Json.JsonReader reader,System.Type&amp; objectType,Newtonsoft.Json.Serialization.JsonContract&amp; contract,Newtonsoft.Json.Serialization.JsonProperty member,Newtonsoft.Json.Serialization.JsonContainerContract containerContract ,Newtonsoft.Json.Serialization.JsonProperty containerMember,System.Object existingValue,System.Object&amp; newValue,System.String&amp; id)   Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(Newtonsoft.Json.JsonReader reader,System.Type objectType,Newtonsoft.Json.Serialization.JsonContract contract,Newtonsoft.Json.Serialization.JsonProperty member,Newtonsoft.Json.Serialization.JsonContainerContract containerContract,Newtonsoft .Json.Serialization.JsonProperty containerMember,System.Object existingValue)   Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(Newtonsoft.Json.JsonReader reader,System.Type objectType,Newtonsoft.Json.Serialization.JsonContract contract,Newtonsoft.Json.Serialization.JsonProperty member,Newtonsoft.Json.Serialization.JsonContainerContract containerContract,Newtonsoft .Json.Serialization.JsonProperty containerMember,System.Object existingValue)   Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IList list,Newtonsoft.Json.JsonReader reader,Newtonsoft.Json.Serialization.JsonArrayContract contract,Newtonsoft.Json.Serialization.JsonProperty containerProperty,System.String id)

1 个答案:

答案 0 :(得分:1)

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

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

这需要将IfDef“Unity”添加到unity项目中。

问题是Json.Net试图引用我在visual studio中设置的汇编库“MO1Common”,但Unity将其“scripts”文件夹中的所有类编译成一个名为“默认汇编库”的默认汇编库。大会-CSHARP”。在Unity编译代码时,只需在Json字符串中替换程序集库的名称即可解决此问题。