验证包含Dictionary

时间:2015-06-02 03:52:44

标签: c# json validation json.net

我正在使用JSON签名处理.NET项目中的许多对象,然后验证这些对象以确保它们包含适当数量的参数等。

但是,我不知道如何验证这个对象,因为" myActions"可以包含不同数量的元素。这个例子只有两个,但可能还有几个,甚至只有一个(实际上,它总是会有1到5个元素)。

{
    "myCanvas": {
        "width": 700,
        "height": 700,
        "initialScene": "scene1"
    },
    "myActions": {
        "actionOne": {
            "type": "web",
            "text": "Open our homepage.",
            "params": {
                "linkUri": "http://your.server.name/"
            }
        },
        "actionTwo": {
            "type": "web",
            "text": "Show item.",
            "params": {
                "linkUri": "http://your.server.name/items/123"
            }
        }
    },
    "otherStuff": {
        "controlBoard": {
            "format": [
            {
                "image": "image1",
                "x": 0,
                "y": 0,
                "w": 700,
                "h": 700
            }
            ]
        }
    }
}

如何对此进行验证,因为JSON签名可以采用五种形式之一?我可以将其称为字典并以这种方式验证吗?现在,我使用类似这样的东西(下面)w /一个String.Format(因此所有额外的引号和大括号),但我在5个几乎相同的内部使用同样的巨型签名对象,因为我知道myActions将包含1到5个元素。请记住,我无法控制顶级JSON块的格式;我只写了验证器(如下所示)。如果" myActions"是一个数组,这将是一个快照。

""myMetadata"":{{   
    ""myCanvas"":{{
        ""type"":""object"",
        ""required"":true,
        ""properties"":{{
            ""width"":{{
                ""type"":""number"",
                ""required"":true
            }},
            ""height"":{{
                ""type"":""number"",
                ""required"":true
            }},
            ""initialScene"":{{
                ""type"":""string"",
                ""required"":true
            }}
        }}
    }},
    ""myActions"":{{
        ""type"":""object"",
        ""required"":true,
        ""properties"":{{
            {0}
        }}
    }},
    ""otherStuff"":{{
        ""type"":""object"",
        ""required"":true,
        ""properties"":{{
            ""controlBoard"":{{
                ""type"":""object"",
                ""required"":true,
                ""properties"":{{
                    ""format"":{{  
                        ""type"":""array"",
                        ""items"":{{  
                            ""type"":""object"",
                            ""properties"":{{  
                                ""image"":{{  
                                    ""type"":""string"",
                                }},    
                                ""x"":{{  
                                    ""type"":""number"",
                                }},
                                ""y"":{{  
                                    ""type"":""number"",
                                }},
                                ""w"":{{  
                                    ""type"":""number"",
                                }},
                                ""h"":{{  
                                    ""type"":""number"",
                                }}
                            }}
                        }}
                    }}
                }}
            }}
        }}
    }}
}};

1 个答案:

答案 0 :(得分:0)

是的,这是可行的。一些JSON解析器/反序列化器确实支持一些不同的语法,用于反序列化为强类型字典,如您的示例(您的第一个JSON片段)。

我知道我的确如此。

将数据映射到.NET词典的最常见语法之一:

无论哪种,

"SomeDictionary": [
    { "Key": "Key1", "Value": "Value1" },
    { "Key": "Key2", "Value": "Value2" },
    ...
 ]

或者,更直接地,就像你的情况一样:

 "SomeDictionary": {
     "Key1": "Value1",
     "Key2": "Value2",
     ...
  }

(其中“Value1”,“Value2”等不需要是原始类型,但也可以是对象或列表/数组等)

您的目标对象模型(即其类别)将看起来像以下内容:

public class MyParams
{
    public string linkUri { get; set; }
    // ...
}

public class MyAction
{
    public string type { get; set; }
    public string text { get; set; }
    public MyParams @params { get; set; }
}

public class MyOuterObject
{
    // other properties omitted
    public IDictionary<string, MyAction> myActions { get; set; }
    // ...
}

例如,见:

(样本对象模型)

https://github.com/ysharplanguage/FastJsonParser/blob/master/JsonTest/ParserTests.cs#L123

(对应单元测试)

https://github.com/ysharplanguage/FastJsonParser/blob/master/JsonTest/ParserTests.cs#L729

'希望这有帮助,