首页 > 解决方案 > 将 JSON 从 OdooRPC 反序列化为 C# 对象

问题描述

我在使用 json.net 反序列化器将 json 解析为对象时遇到问题。我的对象:

        public class Employee
        {
            public int id { get; set; }
            public string name { get; set; }
            public string work_email { get; set; }
            public Partner address_id { get; set; }
        }

        public class Partner
        {
            public int id { get; set; } //in the example "5021"
            public string name { get; set; } //in the example "company x"
        }

JSON:

{
  "address_id": [
    5021,
    "Company X"
  ],
  "work_email": false,
  "id": 37,
  "name": "John Doe"
}

我理解的错误:当前 JSON 数组(例如 [1,2,3])无法转换为 'Odoo.OdooConnect+Partner',因为该类型需要 JSON 对象(例如 {"name":"value"})正确反序列化。

将 json 更改为 "address_id": {5021,"Company X"} 当然会修复错误,但不可能。

我无法想象没有比使用列表和手动将所有多级键转换为如下属性更好的选择:

if (records.Property("address_id") != null) { Employee.Partner.id = (int)records.SelectToken( "address_id[0]" ); Employee.Partner.name = (int)records.SelectToken( "address_id[1]" ); }

一些帮助?

标签: c#json.netjson-deserialization

解决方案


通过添加这个帮助器来解析 json 来解决。如果“数组”的计数<2,在我的情况下为假,我只是不将令牌添加到作业对象中。

            JObject newJSON = new JObject();
            foreach (KeyValuePair<string, JToken> token in JSON)
            {
                string _keyname = token.Key;
                JToken _value = token.Value;
                if (!token.Key.Contains("_id"))
                {
                    newJSON.Add(_keyname, _value);
                }
                else if (token.Value.Count() < 2)
                {
                    //do nothing
                }
                else
                {
                    newJSON.Add(_keyname, _value.First);
                    newJSON.Add(_keyname + "_name", _value.Last);

                }
            }
            return newJSON;}

推荐阅读