Json.NET JsonConvert.DeserializeObject()返回null值

时间:2014-06-17 14:07:10

标签: c# json serialization 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);

适用于“广告”而非实际的“位置”。 任何的想法 ?

8 个答案:

答案 0 :(得分:16)

我忘了公开这些属性。别忘了这样做......

答案 1 :(得分:10)

为了帮助可能遇到此问题的其他人或与之相关的人......

在我的例子中,我有一个带有其他对象数组的对象,并且在反序列化后这些子对象上的一个引用类型属性始终为null。我尝试了各种各样的东西,包括下载JSON.Net源代码并逐步完成它以找到失败点。

长话短说,问题当然是我自己的问题。这是我的JSON和类的高度简化版本。

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字符串中删除了类名,就可以对它进行反序列化。

本文有助于实现这一目标:https://social.msdn.microsoft.com/Forums/windowsapps/en-US/4d766a28-ff38-477f-8abf-48ed01f74cd2/jsonconvertdeserializeobjectlttgtjsonstring-returning-all-propertieslttgt-as-null?forum=wpdevelop

我在这里没有看到这个答案,所以我希望它能对那些和我犯同样愚蠢错误的人有所帮助。

答案 7 :(得分:0)

我在使用 Newtonsoft.Json 时从未遇到任何问题,但决定在最新项目中使用内置的 json 库。以空结果结束。事实证明以下将失败:

JSON:

{
   "myProperty": "abc"
}

课程:

public void MyClass
{
   public string MyProperty { get; set; }
}

为什么会失败? json中的“myProperty”是驼峰式大小写(以小写字母开头),而MyClass中的MyProperty以大写字母开头。如果您使两种情况相同,则它起作用。我试图弄清楚如何为整个应用程序配置不区分大小写,但显然这是不可能的,所以我回到 Newtonsoft.JSON 并且问题消失了。