展开JsonDynamicObject

时间:2016-03-11 18:00:32

标签: c# json

我试图在迭代每个字段时找出Json.Decode System.Web.Helpers函数产生的加载问题。

在我的open source project中,我有一个可扩展的类型系统,允许Extension开发人员创建自己的自定义类型,可以在他们的项目或其他项目中重用。要将这些自定义类型保存并加载到与此可视编辑器中场景的其余部分相同的JSON文件中,我将利用System.Reflection.Emit命名空间来保存和加载这些自定义类型。

因为这些类型是从外部DLL文件动态加载的,所以我的应用程序直到运行时才知道这些类型是什么。因此,使用Json.Decode<>方法只是一个禁忌。

保存功能按预期工作。但是,我遇到了加载功能的问题。

以下代码用于加载JSON文件,只要instanceType被定义为编辑器内部无法识别的类型:

public static void Open(object instance, dynamic data)
{
    var type = instance.GetType();
    var properties = type.GetProperties();
    var dataFields = ((ObjectHandle)data).Unwrap().GetType().GetFields();

    foreach (var pr in properties)
    {
        foreach (var field in dataFields)
        {
            if (pr.CanWrite && pr.Name == field.Name)
            {
                var value = field.GetValue(data);

                if (pr.PropertyType == typeof(Color))
                {
                    value = Color.FromArgb(value);
                }

                pr.SetValue(instance, field.GetValue(data));
            }
        }
    }
}

问题所在的行var dataFields就是问题所在,我已经尽可能在线研究了潜在的解决方案,但我找不到与JsonDynamicObject相关的内容。

错误如下:

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Web.Helpers.dll

Additional information: Unable to convert to "System.Runtime.Remoting.ObjectHandle". Use Json.Decode<T> instead.

现在,由于我刚才提到的原因,我无法使用Json.Decode<T>,所以还有其他方法可以阅读这个动态对象的字段吗?

我尝试将第二个参数类型更改为对象,但这导致了转换错误:

An unhandled exception of type 'System.InvalidCastException' occurred in sd2api.dll

Additional information: Unable to cast object of type 'System.Web.Helpers.DynamicJsonObject' to type 'System.Runtime.Remoting.ObjectHandle'.

1 个答案:

答案 0 :(得分:0)

切换到Json.NET并省略上面代码中的强制转换后,JSON现在已正确解码。