C#JSON中的解包属性

时间:2014-12-28 22:48:30

标签: c# json serialization deserialization

我需要反序列化这个JSON:

{ "user_id": 0, "resource_id": 0, "resource_name": "file.xml" ...}

到这堂课:

public class Resource 
{
    public ResourceId ResourceId { get; set; }
    public string ResourceName { get; set; }
    ... 
}

public class ResourceId 
{
    public int UserId { get; set; }
    public int ResourceId { get; set; }
}

我需要反序列化器来创建一个新的ResourceId对象来存储" resource_id"的值。和" user_id"。另外,我需要将对象序列化。这可能吗?

我正在使用JSON.net反序列化器/序列化器。

1 个答案:

答案 0 :(得分:0)

首先,您的ResourceId课程甚至无法编译,因为member names cannot be the same as their enclosing type。相反,你必须做类似的事情:

public class ResourceId 
{
    public int UserId { get; set; }
    public int Id { get; set; }
}

您的下一个问题是,包含的类ResourceId的属性作为容器类Resource的属性出现在JSON中。在不更改数据模型的情况下处理此的最佳方法是将它们序列化为代理基础ResourceId属性的容器类上的私有属性,像这样:

[DataContract]
public class Resource 
{
    [IgnoreDataMember]
    public ResourceId ResourceId { get; set; }

    [DataMember(Name="user_id")]
    private int? user_id {
        get
        {
            return ResourceId == null ? (int ?)null : ResourceId.UserId;
        }
        set
        {
            if (value == null)
            {
                ResourceId = null;
            }
            else
            {
                if (ResourceId == null)
                    ResourceId = new ResourceId();
                ResourceId.UserId = value.Value;
            }
        }
    }

    [DataMember(Name="resource_id")]
    private int? resource_id
    {
        get
        {
            return ResourceId == null ? (int?)null : ResourceId.Id;
        }
        set
        {
            if (value == null)
            {
                ResourceId = null;
            }
            else
            {
                if (ResourceId == null)
                    ResourceId = new ResourceId();
                ResourceId.Id = value.Value;
            }
        }
    }

    [DataMember(Name="resource_name")]
    public string ResourceName { get; set; }
}

属性应该是私有的,因为当null是可能值时,单独更改它们确实没有意义。例如:

resource.user_id = null;
resource.resource_id = 3;

可能会产生意想不到的结果。

可以使用[DataContract][IgnoreDataMember]代替[DataMember][JsonIgnore][JsonProperty]。使用数据协定属性使该类与数据协定序列化程序兼容,这可能很有用。