问题
Is there any way in scala/java to evaluate if all items in a JSON are not empty?
I would like to have a validator, avoiding to have items in a json with empty values like:
[{"elem1":"","elem2":"","elem3":"a"}]
Where the first two elements are empty.
回答1:
Using Play JSON:
import play.api.libs.json._
def hasEmptyValue(json: JsValue): Boolean = {
json match {
case _: JsBoolean => false
case _: JsNull => false // could also be true, depending on your definition
case _: JsNumber => false
case JsArray(jsons) =>
if (jsons.nonEmpty) jsons.filter(isEmptyJson).nonEmpty
else true
case JsObject(kvs) =>
if (kvs.nonEmpty) kvs.values.filter(isEmptyJson).nonEmpty
else true
def jsonStringHasEmptyValue(str: String): Boolean =
hasEmptyValue(Json.parse(str))
回答2:
I suppose you should use features of a JSON library you use. Even if the library doesn't provide appropriate validation options, you can implement the validation manually with library's JSON tokenizer. Just an illustration using a tiny JSON parser https://github.com/anatolygudkov/green-jelly:
public class ValidateMyJson {
private static final String myJson = "[{\"elem1\":\"\",\"elem2\":\"\",\"elem3\":\"a\"}]";
public static void main(String[] args) {
final NoEmptyValueValidation noEmptyValueValidation = new NoEmptyValueValidation();
final JsonParser parser = new JsonParser();
parser.setListener(noEmptyValueValidation);
parser.parse(myJson);
parser.eoj();
System.out.println("No empty value validation passed: " + noEmptyValueValidation.isPassed());
}
public static class NoEmptyValueValidation extends JsonParserListenerAdaptor {
private boolean passed = true;
@Override
public boolean onStringValue(final CharSequence data) {
if (data.length() == 0) {
passed = false;
}
return true;
}
public boolean isPassed() {
return passed;
}
}
}
来源:https://stackoverflow.com/questions/61350063/how-to-check-empty-element-in-json