2016-02-15 1 views
1

[Извините за мой ужасный английский]C#: проверка JSON Schema и JSON.stringify

Теперь я использую Json.NET, но это слишком строгая проверка в числовой тип. Уловка заключается в том, что JSON.stringify не видит разницы между «числом» и «целым числом», для него есть только «число». Оказывается, если вы сериализуете 1.0, то вывод будет просто 1 (целое число), в то время как JSON.Net Validator будет ожидаться «число».

Я не хочу назначать «число» в «int», я хочу назначить «целое число» в «float». Пример схемы:

{ 
    "type": "object", 
    "properties": { 
    "singleField": { 
     "type": "number" 
    } 
    } 
} 

Пример JSON:

{ 
    "singleField":1//it is 1.0 after JSON.stringify 
} 

проверки будет не удалась.

Наиболее подходящим решением было бы использовать схему на клиенте, но не имеет такой возможности. Я не привязан к JSON.Net, поэтому принимать любые решения. Я использую .net 3.5.

ответ

0

Причина в старой версии JSON.Net. Этот код работает:

using Newtonsoft.Json; 
using Newtonsoft.Json.Schema; 
using Newtonsoft.Json.Schema.Generation; 

public class JSSchemaTest 
{ 
    class TestClass 
    { 
     public float field = 20; 
    } 
    JSchemaGenerator generator = new JSchemaGenerator(); 
    JsonSerializer serializer = new JsonSerializer(); 

    public void Run() 
    { 
     JSchema schema = generator.Generate(typeof(TestClass)); 
     JsonTextReader reader = new JsonTextReader(new System.IO.StringReader("{field: 2}")); 
     JSchemaValidatingReader validatingReader = new JSchemaValidatingReader(reader); 
     validatingReader.Schema = schema; 
     TestClass res = serializer.Deserialize<TestClass>(validatingReader); 
    } 
} 

Используется Json.NET 8.0.2, Json.NET Schema 2.0.2.

UPD: В качестве альтернативы, в старых версиях JSON.Net мы можем внести небольшое изменение в файл JsonSchemaGenerator. Искать эту строку:

internal static bool HasFlag(JsonSchemaType? value, JsonSchemaType flag) 

И заменить его "возвращение" к собственному:

return (flag == JsonSchemaType.Integer && value == JsonSchemaType.Float) ? true : ((value & flag) == flag);