Question

Je voudrais valider JSON contient une liste de clés / valeurs avant de tenter de Marshall dans une classe de cas en utilisant Lift-JSON. Les données peuvent être imbriquées.

Par exemple:

{ 
 "name": "stack",
 "desc": "desc",
 "age": 29,
 "address": {
  "street": "123 elm", 
  "postal_code": 22222,
  "city": "slc",
 }
}

Quels sont les moyens de vérifier que ce JSON contient des valeurs pour "nom", "âge" et "adresse street"? Supposons que tous les autres champs soient facultatifs.

Désolé si je manque quelque chose d'évident, mais je soupçonne que quelque chose comme ça a déjà été résolu.

Au fait, quelqu'un essaie de commander? https://github.com/nparry/orderly4jvm

Était-ce utile?

La solution

Comme je le vois, vous avez quelques options:

  1. Vous pouvez utiliser "API Parser à bas de niveau de low-json" (recherchez cette phrase sur cette page) pour saisir chacun des champs qui vous tiennent à cœur. Si vous n'avez pas obtenu tous les champs que vous voulez au point que vous rencontrez le jeton d'extrémité, vous lancez une exception. Si vous avez du champ requis, créez votre objet.

    Pro: Cela ne fait qu'une seule fois le JSON. C'est le moyen le plus performant d'utiliser Lift-Json.

    Con: Vous avez créé un logiciel fragile et roulé à la main.

  2. Vous pouvez utiliser Jsonast de Lift-Json, qui est le résultat normal de l'appel parse Méthode (Recherchez "analyser JSON" sur cette page), puis ses expressions de type XPath (recherchez "xpath + hofs" sur cette page) pour déterminer si les champs requis sont présents. S'ils le sont, créez votre objet en passant les champs appropriés au constructeur.

    Pro: Moins roulé à la main que le n ° 1. Analyse uniquement les données une fois.

    Con: Ce n'est pas aussi rapide que # 2.

  3. Utilisez les méthodes de n ° 1 ou n ° 2 pour déterminer si les champs requis sont présents. S'ils le sont, utilisez la désérialisation de Lift-Json (recherchez la "sérialisation" en direction cette page) pour créer et objecter.

    Pro: Je m'étire vraiment ici ... Si vous vous attendez à ce que une grande partie des données soient mauvaises, vous seriez en mesure de déterminer cela avant d'entrer dans le processus un peu plus lourd de désérialisation de lift-json

    Con: Vous avez analysé les données deux fois dans le cas où les données sont valides.

  4. Utilisez simplement la désérialisation de Lift-Json (recherchez la "sérialisation" en direction cette page). Il fait plus ou moins ce qui est décrit dans # 2, sauf qu'il utilise la réflexion pour déterminer quels champs sont nécessaires.

    Pro: C'est la solution la plus maintenable

    Con: Il est plus lent que les n ° 1 et n ° 2.

Ma recommandation: sauf si vous avez absolument besoin des meilleures performances possibles, utilisez # 4. Si vous avez vraiment besoin de vitesse, utilisez # 1. Un autre avantage de l'utilisation d'une solution de style n ° 1 ou n ° 2 est qu'ils vous permettent de faire une coercition étrange aux données, telles que la cartographie de deux noms de champ alternatifs dans JSON à un seul champ dans l'objet Scala.

Autres conseils

Cela a fonctionné pour moi:JSON à XML dans Scala et traitant avec l'option () Résultat

Voici une coupe et une coche vraiment simples d'une de mes questions précédentes. Ce n'est pas une correspondance parfaite à votre exigence, mais peut vous donner quelques idées:

import util.parsing.json.JSON._

object JsonSoap {
  def main(args: Array[String]) {
    val x = parseFull("""{"name":"Joe","surname":"SOAP"}""")

    val y = x collect {
      case m: Map[_, _] => m collect {
        case (key: String, value: String) => key -> value
      }
    }

    val z = for (m <- y; name <- m.get("name"); surname <- m.get("surname"))
    yield {
      <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <soap:Body>
          <Person>
            <Name>{name}</Name>
            <Surname>{surname}</Surname>
          </Person>
        </soap:Body>
      </soap:Envelope>
    }

    println(z)
  }
}

Avez-vous jeté un coup d'œil à ceux-ci:

Analyser JSON à Scala en utilisant Scala standard

Analyser JSON et itérer dans l'objet

JSON simple à XML

Vous validez essentiellement le schéma, alors créez un descripteur qui correspond à votre objet et marchez sur l'objet en utilisant le JSONast validant que chaque niveau a les bons éléments. La façon dont vous structurez votre validateur dépend de vous, mais je refléterais les types afin que vous puissiez marcher à la fois l'AST et le validateur ensemble.

J'ai développé ce analyseur / validateur JSONhttps://github.com/higherstate/jameson

Notre équipe a commencé à regarder l'ordonnance. Pour les objets JSON que nous utilisons, Orderly peut les décrire suffisamment. Je pense que nous les utiliserons.

La bibliothèque ordonnée que vous avez mentionnée: https://github.com/nparry/orderly4jvmsemble être très bon. Il donne des messages d'erreur décents lorsque la validation échoue.

Nous avons examiné l'utilisation du schéma JSON, en particulier la bibliothèque Java Json-Schema-validator:https://github.com/fge/json-schema-validator

Les messages d'erreur n'étaient pas aussi descriptifs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top