c# - 将 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]" ); }
一些帮助?
解决方案
通过添加这个帮助器来解析 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;}
推荐阅读
- python - 无法在python中导入neo4j
- excel - Excel 2013 VBA 使用动态范围更改图表对象源
- php - 加号解码到空间
- c# - Entity Framework Core:无法使用嵌套值对象更新实体
- javascript - 数据表警告:无法重新初始化数据表
- checkbox - 颤动复选框不需要的触摸空间
- mysql - 如何通过大量查询避免nodejs mysql中的死锁?
- image-processing - 在 Keras ImageDataGenerator 或 flow_from_directory 中裁剪图像的中心
- sql - T-SQL,OpenXml 正在将 xml 标签合并到单个记录中
- php - 无法使用 root 用户登录 phpmyadmin