WorkMaze / JUST.net

JUST - JSON Under Simple Transformation (XSLT equivalent for JSON).
MIT License
173 stars 54 forks source link

Multiple token types for exists and not empty #306

Open JacquesBronk opened 1 month ago

JacquesBronk commented 1 month ago

It seems that the existsandnotempty only supports string & array, this might be improved by the following

        public static bool existsandnotempty(string path, JUSTContext context)
        {
            T selector = context.Resolve<T>(context.Input);
            JToken selectedToken = selector.Select(path);
            return selectedToken != null && (
                (selectedToken.Type == JTokenType.String && selectedToken.ToString().Trim() != string.Empty) ||
                (selectedToken.Type == JTokenType.Array && selectedToken.Children().Count() > 0) ||
                (selectedToken.Type == JTokenType.Object && selectedToken.Children().Any()) ||
                (selectedToken.Type == JTokenType.Integer && selectedToken.ToObject<long>() != 0) ||
                (selectedToken.Type == JTokenType.Float && selectedToken.ToObject<double>() != 0.0) ||
                (selectedToken.Type == JTokenType.Boolean) ||
                (selectedToken.Type == JTokenType.Date) ||
                (selectedToken.Type == JTokenType.Bytes && selectedToken.ToObject<byte[]>().Length > 0) ||
                (selectedToken.Type == JTokenType.Guid) ||
                (selectedToken.Type == JTokenType.TimeSpan) ||
                (selectedToken.Type == JTokenType.Uri)
            );
        }

Tests

        [Test]
        public void ExistsAndNotEmpty_Integer()
        {
            const string transformer = "{ \"HasInteger\": \"#existsandnotempty($.Integer)\" }";
            const string input = "{ \"Integer\": 123 }";

            var result = new JsonTransformer().Transform(transformer, input);

            Assert.AreEqual("{\"HasInteger\":true}", result);
        }

        [Test]
        public void ExistsAndNotEmpty_Float()
        {
            const string transformer = "{ \"HasFloat\": \"#existsandnotempty($.Float)\" }";
            const string input = "{ \"Float\": 123.45 }";

            var result = new JsonTransformer().Transform(transformer, input);

            Assert.AreEqual("{\"HasFloat\":true}", result);
        }

        [Test]
        public void ExistsAndNotEmpty_Boolean()
        {
            const string transformer = "{ \"HasBoolean\": \"#existsandnotempty($.Boolean)\" }";
            const string input = "{ \"Boolean\": true }";

            var result = new JsonTransformer().Transform(transformer, input);

            Assert.AreEqual("{\"HasBoolean\":true}", result);
        }

        [Test]
        public void ExistsAndNotEmpty_Date()
        {
            const string transformer = "{ \"HasDate\": \"#existsandnotempty($.Date)\" }";
            const string input = "{ \"Date\": \"2023-10-01T00:00:00Z\" }";

            var result = new JsonTransformer().Transform(transformer, input);

            Assert.AreEqual("{\"HasDate\":true}", result);
        }

        [Test]
        public void ExistsAndNotEmpty_Bytes()
        {
            const string transformer = "{ \"HasBytes\": \"#existsandnotempty($.Bytes)\" }";
            const string input = "{ \"Bytes\": \"SGVsbG8gd29ybGQ=\" }"; // Base64 encoded string

            var result = new JsonTransformer().Transform(transformer, input);

            Assert.AreEqual("{\"HasBytes\":true}", result);
        }

        [Test]
        public void ExistsAndNotEmpty_Guid()
        {
            const string transformer = "{ \"HasGuid\": \"#existsandnotempty($.Guid)\" }";
            const string input = "{ \"Guid\": \"d3b07384-d9a7-4b49-8d1b-6d9a7d3b0738\" }";

            var result = new JsonTransformer().Transform(transformer, input);

            Assert.AreEqual("{\"HasGuid\":true}", result);
        }

        [Test]
        public void ExistsAndNotEmpty_TimeSpan()
        {
            const string transformer = "{ \"HasTimeSpan\": \"#existsandnotempty($.TimeSpan)\" }";
            const string input = "{ \"TimeSpan\": \"00:01:00\" }";

            var result = new JsonTransformer().Transform(transformer, input);

            Assert.AreEqual("{\"HasTimeSpan\":true}", result);
        }

        [Test]
        public void ExistsAndNotEmpty_Uri()
        {
            const string transformer = "{ \"HasUri\": \"#existsandnotempty($.Uri)\" }";
            const string input = "{ \"Uri\": \"http://example.com\" }";

            var result = new JsonTransformer().Transform(transformer, input);

            Assert.AreEqual("{\"HasUri\":true}", result);
        }
Courela commented 1 month ago

Create a pull request for it.