2013-04-03 14 views
9

Güvenilir bir JSON dizgesi doğrulayıcı ile gelen bir yardıma ihtiyacım var - bir dizeyi alan ve geçerli bir JSON olup olmadığını kontrol eden bir yöntem. Örnek: {"color":"red"} veya {"amount":15}'u geçersem "My invalid json" gibi bir şey geçmeyecektir. Kısacası, www.jsonlint.com validatoru kadar güvenilir bir şeye ihtiyacım var. BTW - java nesnesine serileştirmekle ilgilenmiyorum, çünkü bu benim şartım değil. Rasgele bir dizge alabilirim ve tek yapmam gereken geçerli bir JSON biçimine sahip olduğunu doğrulamak.Java'da Güvenilir JSON dizgi doğrulayıcısı

Bu forumda java JSON dizgisi doğrulamaları ile ilgili konuyla ilgili birkaç ileti üzerinde araştırma yaptım. aşağıdaki şekilde org.json.JSONObject ve org.json.JSONArray:

Ben bu sınıfları kullanarak çalıştı:

şimdiye kadar ne yaptım

Ancak

private static boolean isValidJSONStringObject(String requestBody){ 
    try { 
     new JSONObject(requestBody); 
    } catch (JSONException jsonEx) { 
     return false; 
    } 
    return true; 
} 

private static boolean isValidJSONStringArray(String requestBody) { 
    try { 
     new JSONArray(requestBody); 
    } catch (JSONException jsonEx) { 
     return false; 
    } 
    return true; 
} 

aşağıdaki dizeleri (bütün çizgiler) hala geçmesi ve bunlar olmamalıdır, başka bir deyişle

{"color":"red"}{"var":"value"} 

[1,2,3][true,false] 

nesneler/diziler bazı üst nesne/dışında herhangi bir kapsülleme ağırlık tekrar olduğunda. Bu satırları www.jsonlint.com validator'a yapıştırırsanız, ikisi de başarısız olur.

Her zaman bir regex seçeneğinin olduğunu biliyorum, ancak JSON'un yinelemeli doğası nedeniyle% 100 garanti edilemediğini ve bu normal ifadelerin oldukça karmaşık olacağını biliyorum.

Herhangi bir yardım büyük takdir edilecektir!

+0

Diğer kütüphaneleri denediniz mi? Bence Jackson buna izin vermiyor. – yshavit

+1

'" Geçersiz json'um ", geçersiz bir JSON örneğidir, çünkü aslında geçerli bir JSON dizesidir. – pfyod

cevap

6

Gson bunu halledebilir. GSON istenen olmayabilir giriş JSON biraz müsamaha, izin verdiğinin

public boolean isValid(String json) { 
    try { 
     new JsonParser().parse(json); 
     return true; 
    } catch (JsonSyntaxException jse) { 
     return false; 
    } 
} 

String json = "{\"color\":\"red\"}{\"var\":\"value\"}"; 
System.out.println(isValid(json)); 

Not: İşte bir örnek. Örneğin, seçilmemiş anahtarlar otomatik olarak ayrıştırıcı tarafından alıntı yapılanlara dönüştürülür. Bu, beklenen kullanımınıza bağlı olarak bir anlaşma kesicisi olabilir veya olmayabilir.

+1

Jackson kütüphanesi, hangi tür nesnenin seri hale getirileceğini bilmedikçe, bununla başa çıkamaz. Bu Gson kütüphanesi daha iyidir, ancak biraz hoş görünmektedir. Örneğin, bir hata atmak yerine abc'yi '' abc '' ye çevirir. Ama sadece .isJsonObject() '(JsonElement yöntemi) için kabul edilebilir olanı sınırlarsanız, o zaman iyi çalışır. – Allan

+1

@Allan - Jackson ***, bir son nesne türü olmadan JSON'u ayrıştırabilir (örneğin, readTree yöntemlerinden birini kullanarak). Ancak (varsayılan olarak) geçersiz JSON için güvenilir bir şekilde geri bildirim yapmaz.Gson esneklik modu bazı yönlerden yumuşaktır ve en yeni varsayılan hata düzeltmeleri açıkça yapılmamıştır. Geri bildiriminiz için teşekkürler, cevabımı güncelledim. – Perception

+0

Evet, gson ayrıştırıcısının "yumuşak esneklik modu" göz önüne alındığında (şimdilik), tüm gereksinimlerimizi karşılamak için jackson ayrıştırıcısını tamamlamaya karar verdik. – rich

3

Şu an için bizim çözümümüz. İki farklı kütüphaneyi (gson - ilk özel yöntem ve jackson - ikinci özel yöntem) kullanmak ideal değildir, ancak en azından tüm birim/entegrasyon testlerimizi geçiyoruz. Bahse girerim sadece kriko araçlarıyla ihtiyacımız olan her şeyi yapabiliriz.

public static boolean isStringValidJSON(String jsonString) { 
    return (isJSONStringObjectOrArray(jsonString) && isJSONStringParsable(jsonString)); 
} 

private static boolean isJSONStringObjectOrArray(String jsonString) { 
    try { 
     JsonElement element = new JsonParser().parse(jsonString); 

     return (element.isJsonObject() || element.isJsonArray()); 
    } catch (JsonSyntaxException jsonEx) { 
     return false; 
    } 
} 

private static boolean isJSONStringParsable(String jsonString) { 
    try { 
     org.codehaus.jackson.JsonParser parser = 
      new ObjectMapper().getJsonFactory().createJsonParser(jsonString); 
     while(parser.nextToken() != null) { 
     } 
     return true; 
    } catch (JsonParseException e) { 
     return false; 
    } catch (IOException e) { 
     return false; 
    } 
} 
-3

Dize yapıştırın here. Çıkışı görün.

DÜZENLEME:

Yukarıdaki bağlantı artık çalışmıyor, this iyi bir alternatiftir.

+2

OP bu programı programlı olarak yapmaya çalışıyor. bir araç tarafından değil. – SMR