Add json validation and update tests
Also add removal of THROW flag for json decode to not throw an exception if if wanted Add jquery 4.0.0 libs
This commit is contained in:
1 parent
118aacee28
commit
676af5e1a4
5 files changed
+9789
-2
No files matched your search
@@ -164,6 +164,48 @@ final class CoreLibsConvertJsonTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test with flags
|
||||||
|
*
|
||||||
|
* @covers ::jsonConvertToArray
|
||||||
|
* @testdox jsonConvertToArray flag test, if flag is used
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testJsonConvertToArrayWithFlags(): void
|
||||||
|
{
|
||||||
|
$input = '{"valid":"json","invalid":"\xB1\x31"}';
|
||||||
|
$expected_without_flag = [
|
||||||
|
'valid' => 'json'
|
||||||
|
];
|
||||||
|
$expected_with_flag = [
|
||||||
|
'valid' => 'json',
|
||||||
|
'invalid' => "\xB1\x31"
|
||||||
|
];
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_without_flag,
|
||||||
|
\CoreLibs\Convert\Json::jsonConvertToArray($input)
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_with_flag,
|
||||||
|
\CoreLibs\Convert\Json::jsonConvertToArray($input, false, JSON_INVALID_UTF8_IGNORE)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testJsonConvertToArrayRemoveThrowFlag(): void
|
||||||
|
{
|
||||||
|
$input = '{"valid":"json","invalid":"\xB1\x31"}';
|
||||||
|
// show NOT throw an exception
|
||||||
|
try {
|
||||||
|
$this->assertEquals(
|
||||||
|
[],
|
||||||
|
\CoreLibs\Convert\Json::jsonConvertToArray($input, flags:JSON_THROW_ON_ERROR)
|
||||||
|
);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$this->fail('Exception was thrown despite flag removal');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* test json error states
|
* test json error states
|
||||||
*
|
*
|
||||||
@@ -189,6 +231,49 @@ final class CoreLibsConvertJsonTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test json error states
|
||||||
|
*
|
||||||
|
* @covers ::jsonValidate
|
||||||
|
* @dataProvider jsonErrorProvider
|
||||||
|
* @testdox jsonValidate $input will be $expected_i/$expected_s [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|null $input
|
||||||
|
* @param int $expected_i
|
||||||
|
* @param string $expected_s
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testJsonValidateGetLastError(?string $input, int $expected_i, string $expected_s): void
|
||||||
|
{
|
||||||
|
\CoreLibs\Convert\Json::jsonValidate($input);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_i,
|
||||||
|
\CoreLibs\Convert\Json::jsonGetLastError()
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_s,
|
||||||
|
\CoreLibs\Convert\Json::jsonGetLastError(true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test json validation
|
||||||
|
*
|
||||||
|
* @covers ::jsonValidate
|
||||||
|
* @testdox jsonValidate test valid and invalid json
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testJsonValidate(): void
|
||||||
|
{
|
||||||
|
$this->assertTrue(
|
||||||
|
\CoreLibs\Convert\Json::jsonValidate('{"valid": "json"}')
|
||||||
|
);
|
||||||
|
$this->assertFalse(
|
||||||
|
\CoreLibs\Convert\Json::jsonValidate('not valid json')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ $json = '["f: {b"""ar}]';
|
|||||||
$output = Json::jsonConvertToArray($json);
|
$output = Json::jsonConvertToArray($json);
|
||||||
print "S::E-JSON: $json: " . DgS::printAr($output) . "<br>";
|
print "S::E-JSON: $json: " . DgS::printAr($output) . "<br>";
|
||||||
print "S::E-JSON ERROR: " . Json::jsonGetLastError() . ": " . Json::jsonGetLastError(true) . "<br>";
|
print "S::E-JSON ERROR: " . Json::jsonGetLastError() . ": " . Json::jsonGetLastError(true) . "<br>";
|
||||||
|
print "S::E Validate: " . Json::jsonValidate($json) . ": " . Json::jsonGetLastError(true) . "<br>";
|
||||||
|
|
||||||
// direct
|
// direct
|
||||||
$json = '{"direct": "static function call"}';
|
$json = '{"direct": "static function call"}';
|
||||||
|
|||||||
+9680
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,2 @@
|
|||||||
|
/*! jQuery v4.0.0 | (c) OpenJS Foundation and other contributors | jquery.com/license */
|
||||||
|
!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=t(e,!0):t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";if(!e.document)throw Error("jQuery requires a window with a document");var n=[],r=Object.getPrototypeOf,i=n.slice,o=n.flat?function(e){return n.flat.call(e)}:function(e){return n.concat.apply([],e)},a=n.push,s=n.indexOf,u={},l=u.toString,c=u.hasOwnProperty,f=c.toString,p=f.call(Object),d={};function h(e){return null==e?e+"":"object"==typeof e?u[l.call(e)]||"object":typeof e}function g(e){return null!=e&&e===e.window}function v(e){var t=!!e&&e.length,n=h(e);return!("function"==typeof e||g(e))&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}var y=e.document,m={type:!0,src:!0,nonce:!0,noModule:!0};function x(e,t,n){var r,i=(n=n||y).createElement("script");for(r in i.text=e,m)t&&t[r]&&(i[r]=t[r]);n.head.appendChild(i).parentNode&&i.parentNode.removeChild(i)}var b="4.0.0",w=/HTML$/i,T=function(e,t){return new T.fn.init(e,t)};function C(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}T.fn=T.prototype={jquery:b,constructor:T,length:0,toArray:function(){return i.call(this)},get:function(e){return null==e?i.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=T.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return T.each(this,e)},map:function(e){return this.pushStack(T.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(i.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(T.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(T.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()}},T.extend=T.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"!=typeof a&&"function"!=typeof a&&(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(T.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||T.isPlainObject(n)?n:{},i=!1,a[t]=T.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},T.extend({expando:"jQuery"+(b+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!!e&&"[object Object]"===l.call(e)&&(!(t=r(e))||"function"==typeof(n=c.call(t,"constructor")&&t.constructor)&&f.call(n)===p)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){x(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(v(e))for(n=e.length;r<n&&!1!==t.call(e[r],r,e[r]);r++);else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},text:function(e){var t,n="",r=0,i=e.nodeType;if(!i)while(t=e[r++])n+=T.text(t);return 1===i||11===i?e.textContent:9===i?e.documentElement.textContent:3===i||4===i?e.nodeValue:n},makeArray:function(e,t){var n=t||[];return null!=e&&(v(Object(e))?T.merge(n,"string"==typeof e?[e]:e):a.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:s.call(t,e,n)},isXMLDoc:function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!w.test(t||n&&n.nodeName||"HTML")},contains:function(e,t){var n=t&&t.parentNode;return e===n||!!(n&&1===n.nodeType&&(e.contains?e.contains(n):e.compareDocumentPosition&&16&e.compareDocumentPosition(n)))},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,a=0,s=[];if(v(e))for(r=e.length;a<r;a++)null!=(i=t(e[a],a,n))&&s.push(i);else for(a in e)null!=(i=t(e[a],a,n))&&s.push(i);return o(s)},guid:1,support:d}),"function"==typeof Symbol&&(T.fn[Symbol.iterator]=n[Symbol.iterator]),T.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){u["[object "+t+"]"]=t.toLowerCase()});var j=n.pop,E="[\\x20\\t\\r\\n\\f]",k=y.documentMode,S=k&&RegExp(":enabled|:disabled|\\["+E+"*name"+E+"*="+E+"*(?:''|\"\")"),D=RegExp("^"+E+"+|((?:^|[^\\\\])(?:\\\\.)*)"+E+"+$","g"),A="(?:\\\\[\\da-fA-F]{1,6}"+E+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",N=RegExp("^"+E+"*([>+~]|"+E+")"+E+"*"),q=RegExp(E+"|>"),O=/[+~]/,L=y.documentElement,H=L.matches||L.msMatchesSelector;function P(){var e=[];function t(n,r){return e.push(n+" ")>T.expr.cacheLength&&delete t[e.shift()],t[n+" "]=r}return t}function R(e){return e&&void 0!==e.getElementsByTagName&&e}var M="\\["+E+"*("+A+")(?:"+E+"*([*^$|!~]?=)"+E+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+A+"))|)"+E+"*\\]",W=":("+A+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",$={ID:RegExp("^#("+Line truncated
|
||||||
@@ -27,10 +27,14 @@ class Json
|
|||||||
* set original value as array
|
* set original value as array
|
||||||
* @return array<mixed> returns an array from the json values
|
* @return array<mixed> returns an array from the json values
|
||||||
*/
|
*/
|
||||||
public static function jsonConvertToArray(?string $json, bool $override = false): array
|
public static function jsonConvertToArray(?string $json, bool $override = false, int $flags = 0): array
|
||||||
{
|
{
|
||||||
if ($json !== null) {
|
if ($json !== null) {
|
||||||
$_json = json_decode($json, true);
|
// if flags has JSON_THROW_ON_ERROR remove it
|
||||||
|
if ($flags & JSON_THROW_ON_ERROR) {
|
||||||
|
$flags = $flags & ~JSON_THROW_ON_ERROR;
|
||||||
|
}
|
||||||
|
$_json = json_decode($json, true, flags:$flags);
|
||||||
if (self::$json_last_error = json_last_error()) {
|
if (self::$json_last_error = json_last_error()) {
|
||||||
if ($override == true) {
|
if ($override == true) {
|
||||||
// init return as array with original as element
|
// init return as array with original as element
|
||||||
@@ -65,6 +69,21 @@ class Json
|
|||||||
return (string)$json_string;
|
return (string)$json_string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate if a json string could be decoded.
|
||||||
|
* Weill set the internval last error state and info can be read with jsonGetLastError
|
||||||
|
*
|
||||||
|
* @param string $json
|
||||||
|
* @param int $flags only JSON_INVALID_UTF8_IGNORE is currently allowed
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function jsonValidate(string $json, int $flags = 0): bool
|
||||||
|
{
|
||||||
|
$json_valid = json_validate($json, flags:$flags);
|
||||||
|
self::$json_last_error = json_last_error();
|
||||||
|
return $json_valid;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* returns human readable string for json errors thrown in jsonConvertToArray
|
* returns human readable string for json errors thrown in jsonConvertToArray
|
||||||
* Source: https://www.php.net/manual/en/function.json-last-error.php
|
* Source: https://www.php.net/manual/en/function.json-last-error.php
|
||||||
|
|||||||
Reference in new issue
Block a user