using System.Collections.Generic;
using Newtonsoft.Json.Schema;
using Newtonsoft.Json.Linq;
using System.Text.RegularExpressions;
public static void Main()
var schemaPatter = @"(\$scope\.schema = )(\{[\S\s]+)(\$scope\.form)";
var angularJsFile = ReadFromEmbeddedResource();
Regex re = new Regex(schemaPatter, RegexOptions.IgnoreCase);
var match = re.Match(angularJsFile);
string schemaJson = match.Groups[2].ToString().Trim();
var schema = JsonSchema.Parse(schemaJson);
var goodishByLine = JObject.Parse(@"{""authors"":[],""reviewers"":[],""isBlog"":false,""selectedAuthors"":[{""itemId"":""ff355fa0-e7fe-493b-b88e-81690ed4c3f5""}],""selectedReviewers"":[{""itemId"":""fa6273a7-d554-4c85-907c-ca01232df2ad""}],""isInGrid"":false,""itemId"":{}}");
var badByLine = JObject.Parse(@"{""authors"":[],""reviewers"":[],""isBlog"":false,""selectedAuthors"":{""itemId"":""ff355fa0-e7fe-493b-b88e-81690ed4c3f5""},""selectedReviewers"":[{""itemId"":""fa6273a7-d554-4c85-907c-ca01232df2ad""}],""isInGrid"":false,""itemId"":{}}");
Console.WriteLine(goodishByLine.IsValid(schema));
Console.WriteLine(badByLine.IsValid(schema));
private static string ReadFromEmbeddedResource()
return @"(function (angular) {
var mod = angular.module('designer');
mod.requires.push('wdFromSchema');
mod.controller('SimpleCtrl', ['$scope', 'propertyService', function ($scope, propertyService) {
$scope.feedback.showLoadingIndicator = true;
$scope.feedback.showError = false;
$scope.$on('wdFromSchema:submit', function (evt, data) {
$scope.$on('wdFromSchema:cancel', function (evt) {
reviewersWithAffiliations: {
itemType: 'Telerik.Sitefinity.DynamicTypes.Model.Authors.Author',
sfDynamicItemsSelector: 'true',
sfItemType: 'form.itemType',
sfIdentifierField: ""Name"",
sfCustomFilter: 'Active==true '
key: 'reviewersWithAffiliations',
title: 'Medical Reviewers',
key: 'reviewersWithAffiliations[].reviewer',
itemType: 'Telerik.Sitefinity.DynamicTypes.Model.Authors.Author',
sfDynamicItemsSelector: 'true',
sfItemType: 'form.itemType',
sfIdentifierField: ""Name"",
sfCustomFilter: 'Active==true '
key: 'reviewersWithAffiliations[].affiliations',
itemType: 'Telerik.Sitefinity.DynamicTypes.Model.MedicalReviewerAffiliations.MedicalReviewerAffiliation',
sfDynamicItemsSelector: 'true',
sfItemType: 'form.itemType',
sfIdentifierField: ""Title"",
$scope.properties = propertyService.toAssociativeArray(data.Items);
$scope.propsProperty = $scope.properties.SerializedProps;
$scope.metaProperty = $scope.properties.SerializedMeta;
var props = JSON.parse($scope.propsProperty.PropertyValue);
$scope.propsProperty.PropertyValue = JSON.stringify(props, function (key, value) {
if (typeof (value.selectedAuthor) !== 'undefined' && typeof (value.selectedAuthor.itemId) !== 'undefined' && typeof (value.selectedAuthors) == 'undefined') {
value.selectedAuthors = [{ ""itemId"": value.selectedAuthor.itemId }];
delete (value.selectedAuthor);
if (typeof (value.selectedReviewer) !== 'undefined' && typeof (value.selectedReviewer.itemId) !== 'undefined' && typeof (value.selectedReviewers) == 'undefined') {
value.selectedReviewers = [{ ""itemId"": value.selectedReviewer.itemId }];
delete (value.selectedReviewer);
if (typeof (value.selectedReviewers) !== 'undefined' && value.selectedReviewers.length > 0 && typeof (value.reviewersWithAffiliations) == 'undefined') {
value.reviewersWithAffiliations = [];
value.selectedReviewers.map(x => value.reviewersWithAffiliations.push({ ""reviewer"": { ""itemId"": x.itemId, ""itemIds"": null }, ""affiliations"": { ""itemId"": null, ""itemIds"": null } }));
delete (value.selectedReviewers);
$scope.feedback.showError = true;
$scope.feedback.errorMessage = data.Detail;
$scope.feedback.showLoadingIndicator = false;