1

Json.NET を使用して、jsTree のツリー構造をシリアル化および逆シリアル化しようとしています。

クラス定義は次のとおりです。

private class Metadata
    {
        [JsonProperty(PropertyName = "nodeType")]
        public NodeType NodeType;

        [JsonProperty(PropertyName = "typeDepth")]
        public int TypeDepth;
    }

    private class TreeNode
    {
        [JsonProperty(PropertyName = "data")]
        public String Title;

        [JsonIgnore]
        public NodeType NodeType;

        [JsonIgnore] 
        public int TypeDepth;

        [JsonProperty(PropertyName = "children", NullValueHandling = NullValueHandling.Ignore)]
        public List<TreeNode> Children;

        [JsonProperty(PropertyName = "metadata")]
        public Metadata Metadata
        {
            get
            {
                return new Metadata() {NodeType = NodeType, TypeDepth = TypeDepth};
            }

            set { 
                TypeDepth = value.TypeDepth;
                NodeType = value.NodeType;
            }
        }

        private ItemGroup _itemGroup;

        [JsonIgnore]
        public ItemGroup ItemGroup
        {
            get
            {
                if(this.NodeType != NodeType.ItemGroup)
                    throw new InvalidDataException();

                return _itemGroup;
            }

            set { _itemGroup = value; }
        }
    }

JSON の例を次に示します。

[{
"data":"Strands",
"attr":{"class":""},
"state":"open",
"metadata":{
    "nodeType":3,
    "typeDepth":0},
"children":[{
    "data":"Math",
    "attr":{"class":"","rel":"itemGroup"},
    "state":"open",
    "metadata":{
        "nodeType":1,
        "typeDepth":0},
    "children":[{
        "data":"Subjects",
        "attr":{"class":""},
        "state":"open",
        "metadata":{"nodeType":3,"typeDepth":1},
        "children":[{
            "data":"Algebra 1",
            "attr":{"class":"","rel":"itemGroup"},
            "state":"open",
            "metadata":{
                "nodeType":1,
                "typeDepth":1},
            "children":[{
                "data":"Clusters",
                "attr":{"class":""},
                "state":"open",
                "metadata":{
                    "nodeType":3,
                    "typeDepth":2},
                "children":[{
                    "data":"Factoring",
                    "attr":{"rel":"itemGroup"},
                    "metadata":{
                        "nodeType":1,
                        "typeDepth":2}},
                    {"data":"Substitution",
                    "attr":{"class":"","rel":"itemGroup"},
                    "metadata":{"nodeType":1,"typeDepth":2}}]}]}]}]}]}]

私はこのように逆シリアル化しようとします:List<TreeNode> tree = (List<TreeNode>)JsonConvert.DeserializeObject(form["treeJson"], typeof (List<TreeNode>));

ツリー構造は正しく逆シリアル化されていますが、どのノードにもメタデータがありません。

ここで何がうまくいかないのか誰にもわかりますか?

ありがとう!

4

2 に答える 2

1

Metadataプロパティを次のように変更すると

[JsonProperty(PropertyName = "metadata")]
public Metadata Metadata { get; set; }

うまくいくようです

var tree = JsonConvert.DeserializeObject<List<TreeNode>>(jsonstring);

それを実装する理由

[JsonProperty(PropertyName = "metadata")]
public Metadata Metadata
{
    get
    {
        return new Metadata() {NodeType = NodeType, TypeDepth = TypeDepth};
    }
    set { 
          TypeDepth = value.TypeDepth;
           NodeType = value.NodeType;
    }
}

于 2012-06-18T20:24:28.977 に答える
0

クラスのメタデータは非公開です。私の知る限り、これにより Json シリアライザーがアクセスできなくなります。したがって、プロパティ値は null のままになります。

于 2012-06-18T18:55:59.533 に答える