我尝试反序列化此字符串:
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);
适用于“广告”而非实际的“位置”。 任何的想法 ?
答案 0 :(得分:16)
我忘了公开这些属性。别忘了这样做......
答案 1 :(得分:10)
为了帮助可能遇到此问题的其他人或与之相关的人......
在我的例子中,我有一个带有其他对象数组的对象,并且在反序列化后这些子对象上的一个引用类型属性始终为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
]
}
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
}
发生的事情是,因为Owner
属性出现在OwnerId
属性之前的JSON中,所以当设置OwnerId
属性时,setter代码确定当前值与设置的值不同(因为当前值为null),因此它将Owner
属性设置为null。
要解决此问题,我还要检查针对Owner
对象的ID设置的值,如果它们相同,则跳过将Owner
设置为null。
不可否认,我的问题的原因可能并不是每个人都一样,但这至少是一个警示故事,要仔细检查在反序列化过程中初始化对象时发生的事情。
答案 2 :(得分:4)
我不知道你是如何尝试反序列化的,但这应该有效....
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);
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; }
}
答案 3 :(得分:1)
就我而言,我的类属性具有内部设置器,将它们设置为公开后,问题就解决了。
答案 4 :(得分:0)
确保JSON中的数组名称与类中的属性名称匹配
说明(寻找“组件”):
<强> JSON:强>
{
"Components": [
{
"Attribute1": "ABC",
"Attribute2": "XYZ"
}
]
}
<强>类别:强>
public class MyClass
{
public IList<Component> Components { get; set; }
}
<强>反序列化强>
JsonConvert.DeserializeObject<MyClass>(File.ReadAllText(@"ComponentSet.json"))
答案 5 :(得分:0)
就我而言,还有一个更细微的错误。很容易错误地在json键中添加前导或尾随空格。发生这种情况时,将无法识别该密钥,并且尝试对其进行反序列化会将其值设置为null。
例如:{" id": 123}
由于前导空格 id
,无法识别此" id"
字段。要解决此问题,请修复json以改为使用"id"
。
答案 6 :(得分:0)
我的问题是我在JSON字符串的开头包含了类名。我从另一个类的序列化输出中复制粘贴了该类,该类包含我想反序列化的类,并且有意地包含了类名,认为这是正确的JSON字符串。一旦我从JSON字符串中删除了类名,就可以对它进行反序列化。
我在这里没有看到这个答案,所以我希望它能对那些和我犯同样愚蠢错误的人有所帮助。
答案 7 :(得分:0)
我在使用 Newtonsoft.Json 时从未遇到任何问题,但决定在最新项目中使用内置的 json 库。以空结果结束。事实证明以下将失败:
JSON:
{
"myProperty": "abc"
}
课程:
public void MyClass
{
public string MyProperty { get; set; }
}
为什么会失败? json中的“myProperty”是驼峰式大小写(以小写字母开头),而MyClass中的MyProperty以大写字母开头。如果您使两种情况相同,则它起作用。我试图弄清楚如何为整个应用程序配置不区分大小写,但显然这是不可能的,所以我回到 Newtonsoft.JSON 并且问题消失了。