2016-02-15 53 views
1

[對不起,我的英語太可怕]C#:JSON模式驗證和JSON.stringify

現在我用JSON.Net,但實在是太嚴格驗證的數字類型。 問題在於JSON.stringify在「數字」和「整數」之間沒有區別,他只有「數字」。 事實證明,如果你序列化1.0,輸出將只是1(整數),而JSON.Net驗證器將被期望爲「數字」。

我不想在「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架構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);