2012-04-19 10 views
22

Jackson JSON bir dize almaya çalışıyorum ve geçerli bir JSON olup olmadığını belirlemeye çalışıyorum. Kullanmak için bir kod örneği önerebilir (Java)?JSON ile JSON Nasıl Doğrulanır JSON

+1

JSON geçerli olduğunu DeFina nasıl:

public Optional<JsonProcessingException> validateJson(final String json) { try{ objectMapper.readTree(json); return Optional.empty(); } catch(JsonProcessingException e){ return Optional.of(e); } catch(IOException e) { throw new RuntimeException(e); } } 

Sonra böyle bu yöntemi kullanabilir? – Slavus

+1

@Slavus: JSON sözdizimi standardını karşılayan herhangi bir dizgi geçerli bir JSON'dur. Geçerli bir JSON tanımlamıyoruz. – Vivek

+0

Yıllar geç kaldım ve bu 2012 yılında mevcut olmayabilir, ancak [JSON şeması] (http://json-schema.org/) düşünüyor musunuz? – Stroboskop

cevap

27

bunun için bir kullanım durumu ne olduğundan emin değil, ama bunu yapmalısınız:

public boolean isValidJSON(final String json) { 
    boolean valid = false; 
    try { 
     final JsonParser parser = new ObjectMapper().getJsonFactory() 
      .createJsonParser(json); 
     while (parser.nextToken() != null) { 
     } 
     valid = true; 
    } catch (JsonParseException jpe) { 
     jpe.printStackTrace(); 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 

    return valid; 
} 
+3

getJsonFactory() kullanımdan kaldırılmıştır. – Arash

+0

Kısa ve zarif bir çözüm şu adrestedir: [@pdem'e teşekkürler] (http://stackoverflow.com/a/29414638/452708) 'deneyin { ObjectMapper objectMapper = ...; JsonNode jsonNode = objectMapper.readTree (yourJsonString); } catch (JsonProcessingException e) {........} ' – Abhijeet

+1

her iki yöntem de amorti edilir: getJsonFactory(). CreateJsonParser (json). Kullanmak için bunu kullanın: getFactory() .Parser (json) – kiedysktos

10

ayrı ayrı Bean Validation API kullanarak öneriyoruz: yani, bir POJO ilk bağlama verisi ardından POJO doğrulamak edilir. Veri formatı seviyesi Şemalar bence çok faydalı değil: genellikle daha yüksek seviyedeki endişeleri doğrulamak zorunda kalıyor ve şema dilleri kendiliğinden saklı. formatı doğrulananlar kullanılır (XML Şeması ve JSON Şeması'nın her ikisi de bu temel kusura sahiptir). Bunu yapmak kodu daha modüler hale getirir, tekrar kullanılabilir hale getirir ve endişeleri ayırır (serileştirme, veri doğrulama).

Ama aslında bir adım daha ileri gidip DropWizard'a bir göz atmanızı öneririm - Jackson ve Validation API uygulamasını (Hazırda Bekletme projesinden) bütünleştirir. Algı cevabı muhtemelen birçok ihtiyaçlarına uygun olsa da

+0

Dropwizard yeni bir eve taşınmış gibi görünüyor (www.dropwizard.io) ve şu anda çağrı yapıyor "ops dostu, yüksek performanslı, RESTful web geliştirmek için bir Java çerçevesi Hizmetler".Okumadım ama muhtemelen Jackson ve Validation API'yi entegre ediyor. Geri kalanına ihtiyacınız olup olmadığından emin değilim. – Wivani

+0

Evet, DropWizard halen Jackson ve Validation API'sini şu an itibariyle entegre ediyor (Şubat 2016). Projeyi değiştirenleri görmüyorum, bu noktada oldukça olgun. Tabii ki diğer ciltleme kütüphanelerini de kullanabilirsiniz (JAX-RS son derece takılabilir), fakat temel olarak bu 2 libl muhtemelen kalacaktır. – StaxMan

12

, bu yakalayamazlar bazı sorunlar var, bunlardan biri yinelenen anahtarlar, şu örneği düşünün geçerli: tamamlayıcı olarak

String json = "{ \"foo\" : \"bar\", \"foo\" : \"baz\" }"; 

, sizin için kontrol edebilirsiniz aşağıdaki kod ile anahtarları çoğaltmak: Bu yinelenen anahtar veya diğer hata JsonProcessingException atar

ObjectMapper objectMapper = new ObjectMapper(); 
objectMapper.enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY); 
objectMapper.readTree(json); 

.

public static boolean isValidJSON(final String json) throws IOException { 
    boolean valid = true; 
    try{ 
     objectMapper.readTree(json); 
    } catch(JsonProcessingException e){ 
     valid = false; 
    } 
    return valid; 
} 
7

bu işlevi kullanın.

Bu da başka bir olası uygulamasıdır:

jsonHelper.validateJson(mappingData.getMetadataJson()) 
        .map(e -> String.format("Error: %s at %s", e.getMessage(), e.getLocation().toString())) 
        .orElse("Valid JSON"); 
1

Diğer bir seçenek Bu bir nesneyi döndürmek için ve arama kodu daha işlevsel bir yaklaşım içinde kullanmasını sağlar Java 8'de java.util.Optional kullanarak olurdu: Jackson ile