将JSON从OdooRPC反序列化为C#对象
我在使用json.net反序列化程序将json解析为对象时遇到问题。 我的目标:将JSON从OdooRPC反序列化为C#对象,c#,json.net,json-deserialization,C#,Json.net,Json Deserialization,我在使用json.net反序列化程序将json解析为对象时遇到问题。 我的目标: public class Employee { public int id { get; set; } public string name { get; set; } public string work_email { get; set; } public Partner addres
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来解决。如果“array”的数量很好,我不明白你为什么会这么惊讶:JSON语法很清楚,[]意味着你有一个数组,你不能将它转换成一个简单的类。如果要自动解析JSON,必须使类与JSON兼容,反之亦然。如果JSON和类不匹配,除了手动解析和执行一些魔术(就像您所做的那样)之外,我看不到任何其他方法。好吧,我一点也不奇怪,我只需要一个解决方案,而不必手动将JSON中带有id的所有键强制转换为属性字段。可能通过某种方式自定义JSON反序列化程序,或者在原始JSON中循环,如果密钥中有“_id”,则将方括号更改为曲括号。您可以将
ObjectToArrayConverter
从应用到。您还需要向合作伙伴的成员添加[JsonProperty(Order=N)]
属性。事实上,我认为这是重复的,同意吗?@dbc,谢谢,这帮了我的忙。这是一个同样的问题。只有我的更简单,因为数组最多只包含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;}