public void UpdateJsonTest()
        {
            var json1 =
@"{
    ""a"": 123, 
    ""name"": ""Yamada""
}
";
            var json2 =
@"{
    ""a"": 123, 
    ""user"": {
        ""id"": 1
    }
}
";
            var json3 =
@"{
    ""name"": ""Mark"",
    ""user"": {
        ""id"": 2
    }
}
";

            var rootId = TreeElementConverter.RootId;
            var j = new TreeElementNotifier<string, IDataObject>(TreeElementConverter.ConvertJson("{ }").NodeChildren[rootId]);
            j.Value(new KeyOrIndex<string>("name")).Value.IsNull();
            j.Value(new KeyOrIndex<string>("user"), new KeyOrIndex<string>("id")).Value.IsNull();

            var nameHistory = j.ValueChanged(new KeyOrIndex<string>("name")).SubscribeHistory();
            var userIdHistory = j.ValueChanged(new KeyOrIndex<string>("user"), new KeyOrIndex<string>("id")).SubscribeHistory();

            j.ModifyCurrentTreeStraight(tree => tree.Merge(TreeElementConverter.ConvertJson(json1).NodeChildren[rootId], (x, y) => false));
            j.ModifyCurrentTreeStraight(tree => tree.Merge(TreeElementConverter.ConvertJson(json2).NodeChildren[rootId], (x, y) => false));
            j.ModifyCurrentTreeStraight(tree => tree.Merge(TreeElementConverter.ConvertJson(json3).NodeChildren[rootId], (x, y) => false));

            userIdHistory.Values.ElementAt(0).Value.IsNull();
            userIdHistory.Values.ElementAt(1).Value.LeafValue.CastOrDefault<int>().Is(1);
            userIdHistory.Values.ElementAt(2).Value.LeafValue.CastOrDefault<int>().Is(2);
            userIdHistory.Values.ElementAt(0).Key.Is(userIdHistory.Values.ElementAt(1).Key);
            userIdHistory.Values.ElementAt(1).Key.Is(userIdHistory.Values.ElementAt(2).Key);
            userIdHistory.Values.Count().Is(3);

            nameHistory.Values.ElementAt(0).Value.LeafValue.CastOrDefault<string>().Is("Yamada");
            nameHistory.Values.ElementAt(1).Value.LeafValue.CastOrDefault<string>().Is("Yamada");
            nameHistory.Values.ElementAt(2).Value.LeafValue.CastOrDefault<string>().Is("Mark");
            nameHistory.Values.ElementAt(0).Key.Is(nameHistory.Values.ElementAt(1).Key);
            nameHistory.Values.ElementAt(1).Key.Is(nameHistory.Values.ElementAt(2).Key);
            nameHistory.Values.Count().Is(3);
            
            j.Value(new KeyOrIndex<string>("name")).Value.LeafValue.CastOrDefault<string>().Is("Mark");
        }
        public void Test()
        {
            var json1 =
            @"{
            ""a"": 123,
            ""name"": ""Yamada""
            }
            ";
            var json2 =
            @"{
            ""a"": 123,
            ""user"": {
            ""id"": 1
            }
            }
            ";
            var json3 =
            @"{
            ""name"": ""Mark"",
            ""user"": {
            ""id"": 2
            }
            }
            ";

            var rootId = TreeElementConverter.RootId;
            var j = new TreeElementNotifier<string, IDataObject>(TreeElementConverter.ConvertJson("{ }").NodeChildren[rootId]);
            var dic = new ReactiveDirectory(j);

            dic.GetValue<string>(KeyOrIndex.Key("name")).IsNull();
            dic.GetValue<int?>(KeyOrIndex.Key("user"), KeyOrIndex.Key("id")).IsNull();
            var history = dic
                .ObserveChanges(x => new {
                    Name = x.GetValue<string>(KeyOrIndex.Key("name")),
                    UserId = x.GetValue<int?>(KeyOrIndex.Key("user"), KeyOrIndex.Key("id"))
                })
                .SubscribeHistory();

            j.ModifyCurrentTreeStraight(tree => tree.Merge(TreeElementConverter.ConvertJson(json1).NodeChildren[rootId], (x, y) => false));
            j.ModifyCurrentTreeStraight(tree => tree.Merge(TreeElementConverter.ConvertJson(json2).NodeChildren[rootId], (x, y) => false));
            j.ModifyCurrentTreeStraight(tree => tree.Merge(TreeElementConverter.ConvertJson(json3).NodeChildren[rootId], (x, y) => false));

            history.Values[0].Name.Is("Yamada");
            history.Values[0].UserId.IsNull();
            history.Values[1].Name.Is("Yamada");
            history.Values[1].UserId.Is(1);
            history.Values[2].Name.Is("Mark");
            history.Values[2].UserId.Is(2);
            history.Values.Count.Is(3);
        }