public static string ToJson(List <PropertyTypeNode> nodes, TypeResolver resolver)
        {
            var serializer = new PropertyTypeNodeJsonSerializer(resolver);

            serializer.Serialize(nodes);
            return(Properties.Serialization.Json.SerializeObject(serializer.SerializedNodes));
        }
        public static string ToJson(JsonSchema schema)
        {
            if (schema?.PropertyTypeNodes == null)
            {
                throw new InvalidOperationException("Invalid property type nodes to be serialized");
            }

            var nodesList = schema.PropertyTypeNodes.ToList();

            // Collect all the dependancies (assemblies and defined symbols)

            var assemblyDependancies = new List <string>();

            var builtinSymbols = new Dictionary <string, PropertyTypeNode.TypeTag>();

            foreach (var node in nodesList)
            {
                assemblyDependancies.AddRange(node.DependantAssemblyNames());

                var collector = new ContainerTypeCollector();
                node.VisitRoot(collector);

                collector.BuiltinTypes.ToList().ForEach(kv => builtinSymbols.Add(kv.Key, kv.Value));
            }

            // Serialize the property container tree

            var serializer = new PropertyTypeNodeJsonSerializer(new TypeResolver(assemblyDependancies, builtinSymbols));

            serializer.Serialize(nodesList);

            var result = new Dictionary <string, object>
            {
                [Keys.VersionKey]            = CurrentVersion,
                [Keys.UsingAssembliesKey]    = schema.UsingAssemblies,
                [Keys.TypesKey]              = serializer.SerializedNodes,
                [Keys.RequiredAssembliesKey] = schema.RequiredAssemblies
            };

            return(Json.SerializeObject(result));
        }