Как проверить правильность данной строки JSON в Java

Как проверить строку JSON в Java? Или я могу разобрать его с помощью регулярных выражений?

Ответ 1

Дикая идея, попробуйте разобрать ее и поймать исключение:

import org.json.*;

public boolean isJSONValid(String test) {
    try {
        new JSONObject(test);
    } catch (JSONException ex) {
        // edited, to include @Arthur comment
        // e.g. in case JSONArray is valid as well...
        try {
            new JSONArray(test);
        } catch (JSONException ex1) {
            return false;
        }
    }
    return true;
}

Этот код использует реализацию JSON API org.json, которая доступна на github, в maven и частично на Android.

Ответ 2

Библиотека JACKSON

Один вариант - использовать библиотеку Джексона. Сначала импортируйте последнюю версию (сейчас):

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.7.0</version>
</dependency>

Затем вы можете выполнить правильный ответ следующим образом:

import com.fasterxml.jackson.databind.ObjectMapper;

public final class JSONUtils {
  private JSONUtils(){}

  public static boolean isJSONValid(String jsonInString ) {
    try {
       final ObjectMapper mapper = new ObjectMapper();
       mapper.readTree(jsonInString);
       return true;
    } catch (IOException e) {
       return false;
    }
  }
}

опция Google GSON

Другой вариант - использовать Google Gson. Импортировать зависимость:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.5</version>
</dependency>

Опять же, вы можете реализовать предлагаемое решение как:

import com.google.gson.Gson;

public final class JSONUtils {
  private static final Gson gson = new Gson();

  private JSONUtils(){}

  public static boolean isJSONValid(String jsonInString) {
      try {
          gson.fromJson(jsonInString, Object.class);
          return true;
      } catch(com.google.gson.JsonSyntaxException ex) { 
          return false;
      }
  }
}

Ниже приведен простой тест:

//A valid JSON String to parse.
String validJsonString = "{ \"developers\": [{ \"firstName\":\"Linus\" , \"lastName\":\"Torvalds\" }, " +
        "{ \"firstName\":\"John\" , \"lastName\":\"von Neumann\" } ]}";

// Invalid String with a missing parenthesis at the beginning.
String invalidJsonString = "\"developers\": [ \"firstName\":\"Linus\" , \"lastName\":\"Torvalds\" }, " +
        "{ \"firstName\":\"John\" , \"lastName\":\"von Neumann\" } ]}";

boolean firstStringValid = JSONUtils.isJSONValid(VALID_JSON_STRING); //true
boolean secondStringValid = JSONUtils.isJSONValid(NOT_VALID_JSON_STRING); //false

Пожалуйста, обратите внимание, что может возникнуть "незначительная" проблема из-за конечных запятых, которые будут исправлены в выпуске 3.0.0.

Ответ 3

С помощью Google Gson вы можете использовать JsonParser:

import com.google.gson.JsonParser;

JsonParser parser = new JsonParser();
parser.parse(json_string); // throws JsonSyntaxException

Ответ 5

Это зависит от того, что вы пытаетесь доказать с помощью своей валидации. Конечно, синтаксический анализ json, как и предполагали другие, лучше, чем использование регулярных выражений, потому что грамматика json сложнее, чем это можно представить с помощью регулярных выражений.

Если json будет когда-либо анализироваться только вашим java-кодом, используйте тот же парсер для проверки.

Но только разбор не обязательно скажет вам, будет ли он принят в других средах. например

  • многие парсеры игнорируют конечные запятые в объекте или массиве, но старые версии IE могут потерпеть неудачу при попадании запятой в конце.
  • Другие парсеры могут принять запятую, но после нее добавить неопределенную/нулевую запись.
  • Некоторые парсеры могут разрешать имена свойств без кавычек.
  • Некоторые парсеры могут по-разному реагировать на не-ASCII символы в строках.

Если ваша проверка должна быть очень тщательной, вы можете:

  • попробуйте разные парсеры, пока не найдете тот, который не работает во всех угловых случаях, которые я упоминал выше
  • или вы можете запустить jsonlint, используя javax.script. *,
  • или объединить с помощью парсера с запущенным jshint используя javax.script. *.

Ответ 6

String jsonInput = "{\"mob no\":\"9846716175\"}";//Read input Here
JSONReader reader = new JSONValidatingReader();
Object result = reader.read(jsonInput);
System.out.println("Validation Success !!");

Загрузите stringtree-json библиотеку

Ответ 7

Немного о разборе:

Json, и на самом деле все языки используют грамматику , которая представляет собой набор правил, которые могут использоваться в качестве подстановок. для того, чтобы разобрать json, вам нужно в основном выработать эти замены в обратном

Json - это контекстная свободная грамматика, что означает, что вы можете иметь бесконечно вложенные объекты/массивы, а json все равно будет действителен. regex обрабатывает только регулярные грамматики (следовательно, "reg" в имени), который является подмножеством контекстных бесплатных грамматик, который не допускает бесконечного вложения, поэтому невозможно использовать только регулярное выражение для синтаксического анализа всех действительных JSON. вы могли бы использовать сложный набор регулярных выражений и циклов с предположением, что никто не будет гнездиться, скажем, 100 уровней в глубину, но это все равно будет очень сложно.

, если вы хотите создать собственный парсер
вы можете сделать рекурсивный парсер спуска после того, как вы разработаете грамматику

Ответ 8

Здесь вы можете найти tool, который может проверять JSON файл, или вы можете просто десериализовать свой JSON файл с помощью любой библиотеки JSON и если операция успешна, то она должна быть действительной (google-json, например, которая будет генерировать исключение, если входной синтаксический анализ недействителен JSON).

Ответ 9

Используя Playframework 2.6, библиотека Json, найденная в Java-API, также может использоваться для простого анализа строки. Строка может быть элементом json массива json. Поскольку возвращаемое значение здесь не имеет значения, мы просто фиксируем ошибку разбора, чтобы определить, является ли строка правильной строкой json или нет.

    import play.libs.Json;

    public static Boolean isValidJson(String value) {
        try{
            Json.parse(value);
            return true;
        } catch(final Exception e){
            return false;
        }
    }

Ответ 10

ИМХО, самый элегантный способ - использовать Java API для обработки JSON (JSON-P), один из стандартов JavaEE, который соответствует JSR 374.

try(StringReader sr = new StringReader(jsonStrn)) {
    Json.createReader(sr).readObject();
} catch(JsonParsingException e) {
    System.out.println("The given string is not a valid json");
    e.printStackTrace();
}

Используя Maven, добавьте зависимость от JSON-P:

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.json</artifactId>
    <version>1.1.4</version>
</dependency>

Посетите официальную страницу JSON-P для получения дополнительной информации.

Ответ 11

Проверьте, является ли данная строка допустимым JSON в Kotlin. Я конвертировал ответ MByD Java в Котлин

fun isJSONValid(test: String): Boolean {
    try {
        JSONObject(test);
    } catch (ex: JSONException) {
        try {
            JSONArray(test);
        } catch (ex1: JSONException) {
            return false;
        }
    }
    return true;
}

Ответ 12

Я нашел для него очень простое решение.

Пожалуйста, сначала установите эту библиотеку net.sf.json-lib для нее.

    import net.sf.json.JSONException;

    import net.sf.json.JSONSerializer;

    private static boolean isValidJson(String jsonStr) {
        boolean isValid = false;
        try {
            JSONSerializer.toJSON(jsonStr);
            isValid = true;
        } catch (JSONException je) {
            isValid = false;
        }
        return isValid;
    }

    public static void testJson() {
        String vjson = "{\"employees\": [{ \"firstName\":\"John\" , \"lastName\":\"Doe\" },{ \"firstName\":\"Anna\" , \"lastName\":\"Smith\" },{ \"firstName\":\"Peter\" , \"lastName\":\"Jones\" }]}";
        String ivjson = "{\"employees\": [{ \"firstName\":\"John\" ,, \"lastName\":\"Doe\" },{ \"firstName\":\"Anna\" , \"lastName\":\"Smith\" },{ \"firstName\":\"Peter\" , \"lastName\":\"Jones\" }]}";
        System.out.println(""+isValidJson(vjson)); // true
        System.out.println(""+isValidJson(ivjson)); // false
    }

Готово. Наслаждайтесь

Ответ 13

Ответы частично верны. Я также столкнулся с той же проблемой. Разбор json и проверка на исключение кажется обычным способом, но решение не подходит для ввода json что-то вроде

{ "outputValueSchemaFormat": "sortByIndexInRecord": 0, "sortOrder": 847874874387209 "нисходящий" } kajhfsadkjh

Как вы можете видеть, json недействителен, так как есть конечные символы мусора. Но если вы попытаетесь разобрать вышеупомянутый json с помощью jackson или gson, тогда вы получите разобранную карту допустимых символов json и мусора, которые игнорируются. Это не необходимое решение, когда вы используете парсер для проверки действительности json.

Для решения этой проблемы см. здесь.

PS: Этот вопрос задавали и отвечали мне.

Ответ 14

import static net.minidev.json.JSONValue.isValidJson;

и затем вызовите эту функцию, передавая вашу строку JSON :)

Ответ 15

public static boolean isJSONValid(String test) {
    try {
        isValidJSON(test);
        JsonFactory factory = new JsonFactory();
        JsonParser parser = factory.createParser(test);
        while (!parser.isClosed()) {
            parser.nextToken();
        }
    } catch (Exception e) {
        LOGGER.error("exception: ", e);
        return false;
    }
    return true;
}

private static void isValidJSON(String test) {
    try {
        new JSONObject(test);
    } catch (JSONException ex) {
        try {
            LOGGER.error("exception: ", ex);
            new JSONArray(test);
        } catch (JSONException ex1) {
            LOGGER.error("exception: ", ex1);
            throw new Exception("Invalid JSON.");
        }
    }
}

Приведенное выше решение охватывает оба сценария:

  • дубликат ключа
  • несоответствующие кавычки или пропущенные скобки и т.д.

Ответ 16

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;    
/**
         * 
         * @param inputJosn
         * @return
         * @throws IOException 
         * @throws JsonParseException 
         * @throws JsonProcessingException
         */
        private static boolean isJsonValid(String inputJosn) throws JsonParseException, IOException  {
            ObjectMapper mapper = new ObjectMapper();
            mapper.enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY);
            JsonFactory factory = mapper.getFactory();
            JsonParser parser = factory.createParser(inputJosn);
            JsonNode jsonObj = mapper.readTree(parser);
            System.out.println(jsonObj.toString());


            return true;
        }

Ответ 17

Вот рабочий пример строгого разбора json с библиотекой gson:

public static JsonElement parseStrict(String json) {
    // throws on almost any non-valid json
    return new Gson().getAdapter(JsonElement.class).fromJson(json); 
}

См. Также мой другой подробный ответ в разделе Как проверить, является ли JSON действительным в Java, используя GSON с дополнительной информацией и расширенным контрольным примером с различными недопустимыми примерами.

Ответ 18

Решение с использованием библиотеки javax.json:

import javax.json.*;

public boolean isTextJson(String text) {
    try {
        Json.createReader(new StringReader(text)).readObject();
    } catch (JsonException ex) {
        try {
            Json.createReader(new StringReader(text)).readArray();
        } catch (JsonException ex2) {
            return false;
        }
    }
    return true;
}