Jos*_*MOS 3 c# serialization json json.net
我试图反序列化这个字符串:
string _jsonObject = {\"Ad\":{\"Type\":\"Request"\,
\"IdAd\":\"xxx@xxx.com\",
\"Category\":\"cat\",
\"SubCategory\":\"subcat\"},
\"Position\":{\"Latitude\":\"38.255\",
\"Longitude\":\"1.2\",
\"Imei\":\"0123456789\"};
}";
Message _message = JsonConvert.DeserializeObject<Message>(_jsonObject);
Run Code Online (Sandbox Code Playgroud)
适用于"广告"而非实际的"位置".任何的想法 ?
Kth*_*rog 20
我忘了公开这些房产.别忘了这样做......
Dav*_*ker 11
为了帮助可能遇到此问题的其他人或与之相关的人...
在我的例子中,我有一个带有其他对象数组的对象,并且在反序列化后,这些子对象上的一个引用类型属性始终为null.我尝试了各种各样的东西,包括下载JSON.Net源代码并逐步完成它以找到失败点.
长话短说,问题当然是我自己的问题.这是我的JSON和类的高度简化版本.
{
"$id": "1",
"RowCount": 10,
"Rows": [{
"$id": 2",
"ItemId": "1",
"ItemName": "Some Item",
"Owner": {
"Name": "John Doe",
"Id": "711D04F5-586F-4FD4-8369-4C00B51DD86F",
// other properties...
},
"OwnerId": "711D04F5-586F-4FD4-8369-4C00B51DD86F"
},
// more rows
]
}
Run Code Online (Sandbox Code Playgroud)
public class Items
{
public int RowCount { get; set; }
public IEnumerable<Item> Rows { get; set; }
}
public class Item
{
private string ownerId;
public string ItemId { get; set; }
public string ItemName { get; set; }
public Person Owner { get; set; }
public string OwnerId
{
get { return this.ownerId; }
set {
if (value != this.ownerId)
{
this.Owner = null;
}
this.ownerId = value;
}
}
}
public class Person
{
public string Name { get; set; }
public string Id { get; set; }
// other properties
}
Run Code Online (Sandbox Code Playgroud)
发生了什么,因为Owner属性出现在属性之前的JSON中OwnerId,当OwnerId设置属性时,setter代码确定当前值与设置的值不同(因为当前值为null),所以它将Owner属性设置为null.
要修复它,我还要检查Owner对象的id 设置Owner的值,如果它们相同则跳过设置为null.
不可否认,我的问题的原因可能并不是每个人都一样,但这至少是一个警示故事,要仔细检查在反序列化过程中初始化对象时发生的情况.
我不知道你是如何尝试反序列化的,但这应该有效......
string json = "{\"Ad\":{\"Type\":\"Request\", \"IdAd\":\"xxx@xxx.com\", \"Category\":\"cat\", \"SubCategory\":\"subcat\"},\"Position\":{\"Latitude\":\"38.255\", \"Longitude\":\"1.2\", \"Imei\":\"0123456789\"}}";
var obj = JsonConvert.DeserializeObject<RootObject>(json);
Run Code Online (Sandbox Code Playgroud)
public class Ad
{
public string Type { get; set; }
public string IdAd { get; set; }
public string Category { get; set; }
public string SubCategory { get; set; }
}
public class Position
{
public string Latitude { get; set; }
public string Longitude { get; set; }
public string Imei { get; set; }
}
public class RootObject
{
public Ad Ad { get; set; }
public Position Position { get; set; }
}
Run Code Online (Sandbox Code Playgroud)