import java.util.*;
public class Main {
public static boolean isValidJson
(Object input
) { if (!(input
instanceof Map)) return false; return checkMap((Map<?, ?>) input);
}
private static boolean checkMap(Map<?, ?> map) {
for (Map.
Entry<?,
?> entry
: map.
entrySet()) { if (!(entry.
getKey() instanceof String)) return false;
Object value
= entry.
getValue(); if (value
== null || value
instanceof String || value
instanceof Number || value
instanceof Boolean) { continue;
} else if (value
instanceof Map) { if (!checkMap((Map<?, ?>) value)) return false;
} else if (value
instanceof List) { if (!checkList((List<?>) value)) return false;
} else {
return false;
}
}
return true;
}
private static boolean checkList(List<?> list) {
if (item
== null || item
instanceof String || item
instanceof Number || item
instanceof Boolean) { continue;
} else if (item
instanceof Map) { if (!checkMap((Map<?, ?>) item)) return false;
} else if (item
instanceof List) { if (!checkList((List<?>) item)) return false;
} else {
return false;
}
}
return true;
}
public static void main
(String[] args
) { // Valid
Map
<String, Object
> valid
= new HashMap
<>(); valid.
put("user",
Map.
of("name",
"A",
"age",
30));
valid.
put("tags",
Arrays.
asList("java",
123,
true,
null));
System.
out.
println(isValidJson
(valid
)); // true
// tidak valid key bukan String
Map
<Object, Object
> invalid1
= new HashMap
<>(); invalid1.put(123, "abc");
System.
out.
println(isValidJson
(invalid1
)); // false
// tidak valid ada tipe aneh (Date)
Map
<String, Object
> invalid2
= new HashMap
<>(); invalid2.
put("time",
new Date()); System.
out.
println(isValidJson
(invalid2
)); // false }
}
aW1wb3J0IGphdmEudXRpbC4qOwoKcHVibGljIGNsYXNzIE1haW4gewoKICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkSnNvbihPYmplY3QgaW5wdXQpIHsKICAgICAgICBpZiAoIShpbnB1dCBpbnN0YW5jZW9mIE1hcCkpIHJldHVybiBmYWxzZTsKICAgICAgICByZXR1cm4gY2hlY2tNYXAoKE1hcDw/LCA/PikgaW5wdXQpOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tNYXAoTWFwPD8sID8+IG1hcCkgewogICAgICAgIGZvciAoTWFwLkVudHJ5PD8sID8+IGVudHJ5IDogbWFwLmVudHJ5U2V0KCkpIHsKICAgICAgICAgICAgaWYgKCEoZW50cnkuZ2V0S2V5KCkgaW5zdGFuY2VvZiBTdHJpbmcpKSByZXR1cm4gZmFsc2U7CgogICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwogICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyB8fCB2YWx1ZSBpbnN0YW5jZW9mIE51bWJlciB8fCB2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7CiAgICAgICAgICAgICAgICBpZiAoIWNoZWNrTWFwKChNYXA8PywgPz4pIHZhbHVlKSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgewogICAgICAgICAgICAgICAgaWYgKCFjaGVja0xpc3QoKExpc3Q8Pz4pIHZhbHVlKSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tMaXN0KExpc3Q8Pz4gbGlzdCkgewogICAgICAgIGZvciAoT2JqZWN0IGl0ZW0gOiBsaXN0KSB7CiAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwgfHwgaXRlbSBpbnN0YW5jZW9mIFN0cmluZyB8fCBpdGVtIGluc3RhbmNlb2YgTnVtYmVyIHx8IGl0ZW0gaW5zdGFuY2VvZiBCb29sZWFuKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgTWFwKSB7CiAgICAgICAgICAgICAgICBpZiAoIWNoZWNrTWFwKChNYXA8PywgPz4pIGl0ZW0pKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIExpc3QpIHsKICAgICAgICAgICAgICAgIGlmICghY2hlY2tMaXN0KChMaXN0PD8+KSBpdGVtKSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAvLyBWYWxpZAogICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gdmFsaWQgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgdmFsaWQucHV0KCJ1c2VyIiwgTWFwLm9mKCJuYW1lIiwgIkEiLCAiYWdlIiwgMzApKTsKCiAgICAgICAgdmFsaWQucHV0KCJ0YWdzIiwgQXJyYXlzLmFzTGlzdCgiamF2YSIsIDEyMywgdHJ1ZSwgbnVsbCkpOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaXNWYWxpZEpzb24odmFsaWQpKTsgLy8gdHJ1ZQoKICAgICAgICAvLyB0aWRhayB2YWxpZCAga2V5IGJ1a2FuIFN0cmluZwogICAgICAgIE1hcDxPYmplY3QsIE9iamVjdD4gaW52YWxpZDEgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgaW52YWxpZDEucHV0KDEyMywgImFiYyIpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpc1ZhbGlkSnNvbihpbnZhbGlkMSkpOyAvLyBmYWxzZQoKICAgICAgICAvLyB0aWRhayB2YWxpZCAgYWRhIHRpcGUgYW5laCAoRGF0ZSkKICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGludmFsaWQyID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgIGludmFsaWQyLnB1dCgidGltZSIsIG5ldyBEYXRlKCkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpc1ZhbGlkSnNvbihpbnZhbGlkMikpOyAvLyBmYWxzZQogICAgfQp9Cg==