【问题标题】:Json.net in Unity for serializationUnity中的Json.net进行序列化
【发布时间】:2019-02-08 23:47:32
【问题描述】:

我一直在为我的 Unity 项目寻找更好的 json 库。我需要使用除属性名称之外的其他名称进行序列化,反序列化包含任意用户定义内容的字典并忽略序列化中的空字段。我已将 Json.NET v12.0.1 的 .dll (net20) 添加到我的 Unity 项目中,它似乎在我的(有限)测试中运行良好。

public class Foo
{
    [JsonProperty("baz", NullValueHandling = NullValueHandling.Ignore)]
    public Bar Baz{ get; set; }

    [JsonProperty("quux", NullValueHandling = NullValueHandling.Ignore)]
    public Qux Quux{ get; set; }
}

public class Corge: Dictionary<string, JObject>
{
    //whatever the user wants to send will come back from the REST call
}

public void OnResponse(string responseJson)
{
    var corge = JsonConvert.DeserializeObject<Corge>(responseJson);
    var name = corge["name"].ToString();
}

在我完全重构我的项目之前,在 Unity 中使用 Json.NET 并发布到不同平台会有任何限制吗?使用dynamic 会比扩展Dictionary 更好吗?

【问题讨论】:

    标签: c# .net json unity3d


    【解决方案1】:
    1. 不,Json.NET 目前适用于所有 Unity 平台。
    2. 我反对为您自己的数据结构使用动态。仅用于反序列化来自外部源(API、其他语言等)的数据

    【讨论】:

    • 动态模型将用于向/从 API 发送和接收任意数据。我想有一个对象扩展字典会更好。
    • 为了清楚起见,我只是想确认 Json.NET 可以在 Unity 可以发布到的任何平台上运行,即 Windows、OSX、Hololens、iOS、Android、Playstation、XBOX 等。你知道吗? net20 是合适的 dll 吗?
    • 嗯,您应该使用 JSON.Net for Unit 资产而不是默认资产:assetstore.unity.com/packages/tools/input-management/… 是的,它适用于所有 Unity 平台
    • 我在 Unity Asset Store 中看到过。我需要一个开源库来包含在我的 SDK 中。我没有看到 Unity 的 json.net 的许可证。我猜使用原始的 json.net 会有问题,因为 Unity 有一个特定的。
    • 哦,对了,现在用原来的json.net应该没问题了。创建“JSON.NET for unity”是因为 unity 过去只支持 .net 2.0,但那是 2 年前的事了。现在已经赶上了最新的.net和c#版本
    【解决方案2】:

    作为对这个问题的跟进,在实现 Json.NET 库后,在 iOS 平台上发出 REST 请求时出现问题。

    Exception: System.NotSupportedException: System.Reflection.Emit.DynamicMethod::.ctor
    at System.Reflection.Emit.DynamicMethod..ctor (System.String name, System.Type returnType, System.Type[] parameterTypes, System.Type owner, System.Boolean skipVisibility)
    

    我们最终切换到Json.NET for Unity,这似乎工作正常。

    【讨论】:

      【解决方案3】:

      升级了 IBM 的 Watson for Unity,得到了同样的错误。发现 IBM 正在使用 Newtonsoft JSON.Net。切换到 Json.NET for Unity,至少可以正常工作。

      【讨论】:

      • Unity SDK Core 的最新更新应该可以解决这个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      相关资源
      最近更新 更多