【问题标题】:Newtosoft Json library deserialization RuntimeBinderException in UnityUnity中的Newtonsoft Json库反序列化RuntimeBinderException
【发布时间】:2023-03-11 14:45:01
【问题描述】:

我正在将一个 C# 项目导入 Unity。 Newtonsoft json 库在 C# 项目(作为 Nugget 包)中运行良好,但在 Unity(作为资产商店包)中会引发异常。我正在使用最新的软件包和以下语法:

dynamic myObj = JsonConvert.DeserializeObject(jsonString)
dynamic myObj2 = myObj.myObj2 ;

Unity 中的 Newtonsoft 库抛出异常(第 2 行):

RuntimeBinderException: 'Newtonsoft.Json.Linq.JObject' does not contain a definition for 'myObj2 '

我的数据格式(简体):

{
"myObj2": [
    {
        "name": "name1",
        "parameters": [
            {
                "paramName" : "parameter1",
                "type": "Bool",
                "value": "false"
            },
            {
                "paramName" : "parameter2",
                "type": "GameObject",
                "value": "someGameObjectName"
            }               
            ]
    }
]
}

绕过这个问题的好方法是什么?

【问题讨论】:

  • 好吧,你的 json 字符串是否代表一个 json 对象,这个 json 对象是否有一个名为“myObj2”的键(区分大小写!)?如果是,请尝试var x = JsonConvert.DeserializeObject(jsonString); var y = x["myObj2"];。不确定根本原因,但可能值得尝试在此处避免 dynamic
  • 你能提供你的json数据吗?
  • 你通常不需要做JsonConvert.DeserializeObject(jsonString);
  • 我将添加数据、var 并指定类型由于某种原因也无法正常工作...
  • 如果您使用var 方法而不是dynamic,您会得到什么?

标签: c# unity3d json.net


【解决方案1】:

创建模型然后反序列化对象并访问所有值

在我的示例中,我正在从 D://readjson.txt 读取相同的 json

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            string data = File.ReadAllText("D://readjson.txt");
            var datavales = JsonConvert.DeserializeObject<RootObject>(data);

            foreach(var vales in datavales.myObj2)
            {
                //access values from here
                Console.WriteLine(vales.name);
            }
        }
    }
    public class Parameter
    {
        public string paramName { get; set; }
        public string type { get; set; }
        public string value { get; set; }
    }

    public class MyObj2
    {
        public string name { get; set; }
        public List<Parameter> parameters { get; set; }
    }

    public class RootObject
    {
        public List<MyObj2> myObj2 { get; set; }
    }
}

另一种方法也许你需要这个:-

static void Main(string[] args)
        {
            string data = File.ReadAllText("D://readjson.txt");
            dynamic datavales = JsonConvert.DeserializeObject(data);

            dynamic keydata = datavales.myObj2;
            foreach(dynamic obj2values in keydata)
            {
               //obj2values contain all the values access it using obj2values object
               Console.WriteLine( obj2values.name);
            }

        }

【讨论】:

    猜你喜欢
    • 2013-06-06
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多