web-dev-qa-db-fra.com

Valider JSON contre le schéma JSON C #

Existe-t-il un moyen de valider une structure JSON par rapport à un schéma JSON pour cette structure? J'ai regardé et trouvé JSON.Net valider mais cela ne fait pas ce que je veux.

JSON.net fait:

JsonSchema schema = JsonSchema.Parse(@"{
  'type': 'object',
  'properties': {
    'name': {'type':'string'},
    'hobbies': {'type': 'array'}
  }
}");

JObject person = JObject.Parse(@"{
  'name': 'James',
  'hobbies': ['.NET', 'LOLCATS']
}");

bool valid = person.IsValid(schema);
// true

Cela valide à vrai.

JsonSchema schema = JsonSchema.Parse(@"{
  'type': 'object',
  'properties': {
    'name': {'type':'string'},
    'hobbies': {'type': 'array'}
  }
}");

JObject person = JObject.Parse(@"{
  'surname': 2,
  'hobbies': ['.NET', 'LOLCATS']
}");

bool valid = person.IsValid(schema);

Cela vaut également vrai

JsonSchema schema = JsonSchema.Parse(@"{
  'type': 'object',
  'properties': {
    'name': {'type':'string'},
    'hobbies': {'type': 'array'}
  }
}");

JObject person = JObject.Parse(@"{
  'name': 2,
  'hobbies': ['.NET', 'LOLCATS']
}");

bool valid = person.IsValid(schema);

Seul cela valide à faux.

Idéalement, je voudrais qu'il valide qu'il n'y a pas de champs aka name là-dedans qui ne devraient pas y être aka surname.

16
Shaun Groenewald

Je pense que vous avez juste besoin d'ajouter

'additionalProperties': false

à votre schéma. Cela empêchera la fourniture de propriétés inconnues.

Alors maintenant, vos résultats seront: - Vrai, Faux, Faux

code de test ....

void Main()
{
var schema = JsonSchema.Parse(
@"{
    'type': 'object',
    'properties': {
        'name': {'type':'string'},
        'hobbies': {'type': 'array'}
    },
    'additionalProperties': false
    }");

IsValid(JObject.Parse(
@"{
    'name': 'James',
    'hobbies': ['.NET', 'LOLCATS']
  }"), 
schema).Dump();

IsValid(JObject.Parse(
@"{
    'surname': 2,
    'hobbies': ['.NET', 'LOLCATS']
  }"), 
schema).Dump();

IsValid(JObject.Parse(
@"{
    'name': 2,
    'hobbies': ['.NET', 'LOLCATS']
  }"), 
schema).Dump();
}

public bool IsValid(JObject obj, JsonSchema schema)
{
    return obj.IsValid(schema);
}

production :-

True
False
False

Vous pouvez également ajouter "requis": fidèle aux champs qui doivent être fournis de cette façon, vous pouvez retourner un message avec des détails sur les champs manquants/invalides: -

Property 'surname' has not been defined and the schema does not allow additional     properties. Line 2, position 19. 
Required properties are missing from object: name. 

Invalid type. Expected String but got Integer. Line 2, position 18. 
13
Andy Robinson

Ok j'espère que cela vous aidera.

Voici votre schéma:

 public class test
{
    public string Name { get; set; }
    public string ID { get; set; }

}

Voici votre validateur:

/// <summary>
    /// extension that validates if Json string is copmplient to TSchema.
    /// </summary>
    /// <typeparam name="TSchema">schema</typeparam>
    /// <param name="value">json string</param>
    /// <returns>is valid?</returns>
    public static bool IsJsonValid<TSchema>(this string value)
        where TSchema : new()
    {
        bool res = true;
        //this is a .net object look for it in msdn
        JavaScriptSerializer ser = new JavaScriptSerializer();
        //first serialize the string to object.
        var obj = ser.Deserialize<TSchema>(value);

        //get all properties of schema object
        var properties = typeof(TSchema).GetProperties();
        //iterate on all properties and test.
        foreach (PropertyInfo info in properties)
        {
            // i went on if null value then json string isnt schema complient but you can do what ever test you like her.
            var valueOfProp = obj.GetType().GetProperty(info.Name).GetValue(obj, null);
            if (valueOfProp == null)
                res = false;
        }

        return res;
    }

Et comment utiliser est:

string json = "{Name:'blabla',ID:'1'}";
        bool res = json.IsJsonValid<test>();

Si vous avez des questions s'il vous plaît demander, j'espère que cela aide, veuillez prendre en considération que ce n'est pas un code complet sans gestion des exceptions et autres ...

3
Liran