Yanıtlar:
Çılgın bir fikir, ayrıştırmayı deneyin ve istisnayı yakalayın:
import org.json.*;
public boolean isJSONValid(String test) {
try {
new JSONObject(test);
} catch (JSONException ex) {
// edited, to include @Arthur's comment
// e.g. in case JSONArray is valid as well...
try {
new JSONArray(test);
} catch (JSONException ex1) {
return false;
}
}
return true;
}
Bu kod , github , maven ve kısmen Android'de bulunan org.json JSON API uygulamasını kullanır .
JACKSON Kütüphanesi
Bir seçenek Jackson kütüphanesini kullanmak olabilir . İlk olarak en son sürümü içe aktarın (şimdi):
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.0</version>
</dependency>
Ardından, doğru yanıtı aşağıdaki gibi uygulayabilirsiniz :
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 seçeneği
Başka bir seçenek de Google Gson'u kullanmaktır . Bağımlılığı içe aktarın:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.5</version>
</dependency>
Yine, önerilen çözümü şu şekilde uygulayabilirsiniz:
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;
}
}
}
Basit bir test burada yapılır:
//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(validJsonString); //true
boolean secondStringValid = JSONUtils.isJSONValid(invalidJsonString); //false
Lütfen, sürümde düzeltilecek virgül nedeniyle "küçük" bir sorun olabileceğini gözlemleyin 3.0.0
.
new ObjectMapper().readTree("28xjRBuOQqupRopHeSuhRQ")
IntNode (28) olarak Exception olmadan ayrışır. Gerçekten beklenmiyor ...
Google Gson ile JsonParser'ı kullanabilirsiniz:
import com.google.gson.JsonParser;
JsonParser parser = new JsonParser();
parser.parse(json_string); // throws JsonSyntaxException
JSONUtils kitaplığında bulunan .mayBeJSON (String str) kullanabilirsiniz .
Doğrulama işleminizle neyi kanıtlamaya çalıştığınıza bağlıdır. Json'un diğerlerinin önerdiği gibi ayrıştırılması kesinlikle regexes kullanmaktan daha iyidir, çünkü json gramer sadece regexes ile temsil edilebileceğinden daha karmaşıktır.
Json yalnızca java kodunuz tarafından ayrıştırılırsa, doğrulamak için aynı ayrıştırıcıyı kullanın.
Ancak sadece ayrıştırma işlemi, diğer ortamlarda kabul edilip edilmeyeceğini size söylemeyecektir. Örneğin
Doğrulamanızın çok kapsamlı olması gerekiyorsa, şunları yapabilirsiniz:
String jsonInput = "{\"mob no\":\"9846716175\"}";//Read input Here
JSONReader reader = new JSONValidatingReader();
Object result = reader.read(jsonInput);
System.out.println("Validation Success !!");
Lütfen stringtree-json kütüphanesini indirin
Ayrıştırma hakkında biraz:
Json ve aslında tüm diller, ikame olarak kullanılabilecek bir dizi kural olan bir gramer kullanır . json'ı ayrıştırmak için temel olarak bu ikameleri tersine çevirmeniz gerekir.
Json bir olduğu bağlam serbest dilbilgisi size sonsuz nesneler / diziler iç içe geçmiş olabilir ve json hala geçerli olacağını, yani. regex yalnızca düzenli gramerleri (dolayısıyla addaki 'reg') işler ; bu, sonsuz yuvalamaya izin vermeyen bağlamsız gramerlerin bir alt kümesidir, bu nedenle tüm geçerli json'ları ayrıştırmak için sadece regex'i kullanmak imkansızdır. 100 seviyeli derinlikte kimsenin geçmişte iç içe geçmeyeceği varsayımıyla karmaşık bir regex ve döngüler seti kullanabilirsiniz, ancak yine de çok zor olacaktır.
kendi ayrıştırıcınızı yazmaya
hazırsanız, dilbilgisi üzerinde çalıştıktan sonra yinelemeli bir iniş ayrıştırıcısı yapabilirsiniz
Belirli bir dizenin Kotlin'de geçerli JSON olup olmadığını kontrol edin . MByD Java'nın cevabını Kotlin'e çevirdim
fun isJSONValid(test: String): Boolean {
try {
JSONObject(test);
} catch (ex: JSONException) {
try {
JSONArray(test);
} catch (ex1: JSONException) {
return false;
}
}
return true;
}
Burada bir JSON dosyasını doğrulayabilen bir araç bulabilirsiniz veya JSON dosyanızı herhangi bir JSON kütüphanesi ile serisini kaldırabilirsiniz ve işlem başarılı olursa geçerli olmalıdır ( örneğin google-json , örneğin giriş ayrıştırma geçerli değil JSON).
Playframework 2.6'yı kullanarak, java api'de bulunan Json kütüphanesi, dizeyi ayrıştırmak için de kullanılabilir. Dize, json dizisinin bir json öğesi olabilir. Döndürülen değer burada önemli olmadığından, dizenin doğru bir json dizesi olup olmadığını belirlemek için ayrıştırma hatasını yakalarız.
import play.libs.Json;
public static Boolean isValidJson(String value) {
try{
Json.parse(value);
return true;
} catch(final Exception e){
return false;
}
}
IMHO, en şık yol JSR 374'e uygun JavaEE standartlarından biri olan JSON İşleme için Java API'sini (JSON-P) kullanmaktır .
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'i kullanarak JSON-P'ye bağımlılığı ekleyin:
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.1.4</version>
</dependency>
Daha fazla bilgi için JSON-P resmi sayfasını ziyaret edin .
İşte gson kütüphanesi ile katı json ayrıştırma için çalışan bir örnek :
public static JsonElement parseStrict(String json) {
// throws on almost any non-valid json
return new Gson().getAdapter(JsonElement.class).fromJson(json);
}
Daha fazla bilgi içeren GSON kullanarak JSON'un Java'da geçerli olup olmadığını kontrol etme ve geçerli olmayan çeşitli örneklerle genişletilmiş test örneği için diğer ayrıntılı yanıtıma bakın .
Gördüğünüz gibi, birçok çözüm var, esas olarak kontrol etmek için JSON'u ayrıştırıyor ve sonunda emin olmak için ayrıştırmanız gerekecek.
Ancak, bağlama bağlı olarak, bir ön kontrol ile performansları artırabilirsiniz.
API'ları çağırdığımda yaptığım şey, sadece ilk karakterin '{' ve sonuncusunun '}' olduğunu kontrol etmektir. Durum böyle değilse, ayrıştırıcı oluşturma zahmetine girmem.
Bunun için çok basit bir çözüm buldum.
Lütfen önce bu kütüphaneyi yükleyin 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
}
Bitti. Zevk almak
Cevaplar kısmen doğrudur. Aynı problemle de karşılaştım. Json ayrıştırma ve istisna kontrol normal yol gibi görünüyor ama çözüm giriş json için başarısız bir şey gibi
{"outputValueSchemaFormat": "", "sortByIndexInRecord": 0, "sortOrder": 847874874387209 "azalan"} kajhfsadkjh
Gördüğünüz gibi json geçersiz çünkü sondaki çöp karakterler var. Ancak, yukarıdaki json'u jackson veya gson kullanarak ayrıştırmaya çalışırsanız, geçerli json'un ayrıştırılmış haritasını alırsınız ve çöp sondaki karakterler göz ardı edilir. Json geçerliliğini kontrol etmek için ayrıştırıcıyı kullanırken gerekli çözüm değildir.
Bu sorunun çözümü için buraya bakın .
Not: Bu soru bana sorularak cevaplandı.
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.");
}
}
}
Yukarıdaki çözüm her iki senaryoyu da kapsar:
javax.json
Kütüphaneyi kullanan bir çözüm :
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;
}
Sen kullanabilirsiniz WellFormedJson
gelen sınıf Validol bildirim doğrulama kütüphanesine.
Bildirgenin kendisi aşağıdaki gibi görünebilir:
new WellFormedJson(
new Unnamed<>(Either.right(new Present<>(jsonRequestString)))
)
Kontrol aşaması şöyle görünür:
Result<JsonElement> result =
(new WellFormedJson(
new Named<>(
"vasya",
Either.right(
new Present<>(
"{\"guest\":{\"name\":\"Vadim Samokhin\",\"email\":\"samokhinvadim@gmail.com\"},\"source\":1,\"items\":[{\"id\":1900},{\"id\":777}]}"
)
)
)
))
.result();
assertTrue(result.isSuccessful());
assertEquals(
"{\"guest\":{\"name\":\"Vadim Samokhin\",\"email\":\"samokhinvadim@gmail.com\"},\"source\":1,\"items\":[{\"id\":1900},{\"id\":777}]}",
result.value().raw().toString()
);
assertEquals(
"{\"name\":\"Vadim Samokhin\",\"email\":\"samokhinvadim@gmail.com\"}",
result.value().raw().getAsJsonObject().get("guest").toString()
);
Bu kadar basit bir görev için aşırıya kaçmış gibi görünebilir, ancak karmaşık bir isteği doğrulamanız gerektiğinde parlar. Geçerli olanın hızlı başlangıç bölümüne göz atın .