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

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

我忘了公开这些房产.别忘了这样做......

  • `{get; 私人集; }`是我的问题!! (5认同)
  • 从字面上看,在阅读评论时我头脑中的谈话:我读到:"我忘了将这些属性公之于众.别忘了这样做......",我想:"那是愚蠢的,我不会有忘记.. <检查代码> <给自己一个勾拳>".谢谢@KthProg (4认同)

Dav*_*ker 11

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

在我的例子中,我有一个带有其他对象数组的对象,并且在反序列化后,这些子对象上的一个引用类型属性始终为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
    ]
}
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.

不可否认,我的问题的原因可能并不是每个人都一样,但这至少是一个警示故事,要仔细检查在反序列化过程中初始化对象时发生的情况.


I4V*_*I4V 5

我不知道你是如何尝试反序列化的,但这应该有效......

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)


Ara*_*sir 5

就我而言,我的类属性有内部设置器,将它们设置为公开后问题就解决了。