我想在iOS上反序列化一个JSON文件并使用Json.Net。但是,当应用程序在XCODE模拟器中运行时,它给出了有关System.Reflection.Emit的错误,似乎XCODE不允许在应用程序中使用该库。 我猜测反射是在尝试将值放在指定类型的字段中时使用的。 我可以避免吗?而不是我想创建像JSONObject,带有键和字段的字典。 我想这种方法可以让我正确地反序列化JSON,没有任何例外。
答案 0 :(得分:0)
您应该尝试使用miniJSON(我当前的选择)或JsonFX来完全支持Unity3D平台。 至于iOS,大多数Unity3D移动开发者都推荐JsonFX用于更大的数据块。
miniJSON: @ GitHub
JsonFX: @ Bitbucket
使用JsonFX进行序列化的示例(来自raybarrera.com blog *):
public string fileName;
public Sandwich sandwich;
private string PATH;
private void Start() {
PATH = Application.dataPath + "/../testData/";
}
private void OnGUI() {
if (GUILayout.Button("SAVE")){
SerializeAndSave();
}
}
private void SerializeAndSave() {
string data = JsonWriter.Serialize(sandwich);
if(!Directory.Exists(PATH)){
Directory.CreateDirectory(PATH);
}
var streamWriter = new StreamWriter(PATH + fileName + ".txt");
streamWriter.Write(data);
streamWriter.Close();
}
* http://www.raybarrera.com/2014/05/18/json-deserialization-using-unity-and-jsonfx/
答案 1 :(得分:0)
我可以使用带有以下 link.xml 的IL2CPP和iOS将Newtonsoft.Json
版本11.0.2用于序列化(未测试反序列化) :
<linker>
<assembly fullname="System">
<type fullname="System.ComponentModel.TypeConverter" preserve="all"/>
<type fullname="System.ComponentModel.ArrayConverter" preserve="all"/>
<type fullname="System.ComponentModel.BaseNumberConverter" preserve="all"/>
<type fullname="System.ComponentModel.BooleanConverter" preserve="all"/>
<type fullname="System.ComponentModel.ByteConverter" preserve="all"/>
<type fullname="System.ComponentModel.CharConverter" preserve="all"/>
<type fullname="System.ComponentModel.CollectionConverter" preserve="all"/>
<type fullname="System.ComponentModel.ComponentConverter" preserve="all"/>
<type fullname="System.ComponentModel.CultureInfoConverter" preserve="all"/>
<type fullname="System.ComponentModel.DateTimeConverter" preserve="all"/>
<type fullname="System.ComponentModel.DecimalConverter" preserve="all"/>
<type fullname="System.ComponentModel.DoubleConverter" preserve="all"/>
<type fullname="System.ComponentModel.EnumConverter" preserve="all"/>
<type fullname="System.ComponentModel.ExpandableObjectConverter" preserve="all"/>
<type fullname="System.ComponentModel.Int16Converter" preserve="all"/>
<type fullname="System.ComponentModel.Int32Converter" preserve="all"/>
<type fullname="System.ComponentModel.Int64Converter" preserve="all"/>
<type fullname="System.ComponentModel.NullableConverter" preserve="all"/>
<type fullname="System.ComponentModel.SByteConverter" preserve="all"/>
<type fullname="System.ComponentModel.SingleConverter" preserve="all"/>
<type fullname="System.ComponentModel.StringConverter" preserve="all"/>
<type fullname="System.ComponentModel.TimeSpanConverter" preserve="all"/>
<type fullname="System.ComponentModel.UInt16Converter" preserve="all"/>
<type fullname="System.ComponentModel.UInt32Converter" preserve="all"/>
<type fullname="System.ComponentModel.UInt64Converter" preserve="all"/>
</assembly>
<!--https://docs.microsoft.com/en-us/dotnet/api/system.linq.expressions.lambdaexpression.name?view=netframework-4.7.2&viewFallbackFrom=netframework-2.0-->
<assembly fullname="System.Core">
<type fullname="System.Linq.Expressions" preserve="all"/>
<type fullname="System.Linq.Expressions.*" preserve="all"/>
<type fullname="System.Linq.Expressions.Interpreter.LightLambda" preserve="all"/>
<type fullname="System.Linq.Expressions.LambdaExpression" preserve="all"/>
</assembly>
<assembly fullname="System.Linq.Expressions">
<type fullname="System.Linq.Expressions" preserve="all"/>
<type fullname="System.Linq.Expressions.*" preserve="all"/>
<type fullname="System.Linq.Expressions.Interpreter.LightLambda" preserve="all"/>
<type fullname="System.Linq.Expressions.LambdaExpression" preserve="all"/>
</assembly>
<assembly fullname="netstandard">
<type fullname="System.Linq.Expressions" preserve="all"/>
<type fullname="System.Linq.Expressions.*" preserve="all"/>
<type fullname="System.Linq.Expressions.Interpreter.LightLambda" preserve="all"/>
<type fullname="System.Linq.Expressions.LambdaExpression" preserve="all"/>
</assembly>
</linker>
尽管您可能会删除其中的一些。我用来序列化的类型是.NET SDK for Sentry的一部分。 source is here。