【问题标题】:How to check empty element in json如何检查json中的空元素
【发布时间】:2020-04-21 18:01:20
【问题描述】:

scala/java 中是否有任何方法可以评估 JSON 中的所有项目是否都不为空?

我想要一个验证器,避免在 json 中包含具有空值的项目,例如:

[{"elem1":"","elem2":"","elem3":"a"}]

前两个元素为空。

【问题讨论】:

  • 你可以递归地检查所有元素是否为非空,无论你想要什么非空定义。我对此表示怀疑——这是一个有效的 JSON。可以为您将 JSON 解析为的案例类生成此类验证器。

标签: java json scala validation


【解决方案1】:

使用播放 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】:

    我想您应该使用您使用的 JSON 库的功能。即使库没有提供适当的验证选项,您也可以使用库的 JSON 标记器手动实现验证。只是一个使用小型 JSON 解析器的插图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;
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 2012-08-28
      相关资源
      最近更新 更多