/// <summary> /// Parses JSON object property starting with the current position of the JSON reader. /// </summary> /// <param name="duplicatePropertyNamesChecker">The duplicate property names checker to use, it will also store the property annotations found.</param> /// <param name="readPropertyAnnotationValue">Function called to read property annotation value.</param> /// <param name="handleProperty">Function callback to handle to resule of parse property.</param> internal void ProcessProperty( DuplicatePropertyNamesChecker duplicatePropertyNamesChecker, Func <string, object> readPropertyAnnotationValue, Action <PropertyParsingResult, string> handleProperty) { Debug.Assert(duplicatePropertyNamesChecker != null, "duplicatePropertyNamesChecker != null"); Debug.Assert(readPropertyAnnotationValue != null, "readPropertyAnnotationValue != null"); Debug.Assert(handleProperty != null, "handleProperty != null"); this.AssertJsonCondition(JsonNodeType.Property); string propertyName; PropertyParsingResult propertyParsingResult = this.ParseProperty(duplicatePropertyNamesChecker, readPropertyAnnotationValue, out propertyName); while (propertyParsingResult == PropertyParsingResult.CustomInstanceAnnotation && this.ShouldSkipCustomInstanceAnnotation(propertyName)) { // Make sure there's no duplicated instance annotation name even though we are skipping over it. duplicatePropertyNamesChecker.MarkPropertyAsProcessed(propertyName); // Skip over the instance annotation value and don't report it to the OM. this.JsonReader.SkipValue(); propertyParsingResult = this.ParseProperty(duplicatePropertyNamesChecker, readPropertyAnnotationValue, out propertyName); } handleProperty(propertyParsingResult, propertyName); if (propertyParsingResult != PropertyParsingResult.EndOfObject) { duplicatePropertyNamesChecker.MarkPropertyAsProcessed(propertyName); } }
/// <summary> /// Parses JSON object property starting with the current position of the JSON reader. /// </summary> /// <param name="propertyAndAnnotationCollector">The duplicate property names checker to use, it will also store the property annotations found.</param> /// <param name="readPropertyAnnotationValue">Function called to read property annotation value.</param> /// <param name="handleProperty">Function callback to handle the result of parsing property.</param> internal void ProcessProperty( PropertyAndAnnotationCollector propertyAndAnnotationCollector, Func <string, object> readPropertyAnnotationValue, Action <PropertyParsingResult, string> handleProperty) { Debug.Assert(propertyAndAnnotationCollector != null, "propertyAndAnnotationCollector != null"); Debug.Assert(readPropertyAnnotationValue != null, "readPropertyAnnotationValue != null"); Debug.Assert(handleProperty != null, "handleProperty != null"); this.AssertJsonCondition(JsonNodeType.Property); string propertyName; PropertyParsingResult propertyParsingResult = this.ParseProperty( propertyAndAnnotationCollector, readPropertyAnnotationValue, out propertyName); while (propertyParsingResult == PropertyParsingResult.CustomInstanceAnnotation && this.ShouldSkipCustomInstanceAnnotation(propertyName)) { // Read over the property name this.JsonReader.Read(); // Skip over the instance annotation value and don't report it to the OM. this.JsonReader.SkipValue(); propertyParsingResult = this.ParseProperty( propertyAndAnnotationCollector, readPropertyAnnotationValue, out propertyName); } handleProperty(propertyParsingResult, propertyName); if (propertyParsingResult != PropertyParsingResult.EndOfObject && propertyParsingResult != PropertyParsingResult.CustomInstanceAnnotation) { propertyAndAnnotationCollector.MarkPropertyAsProcessed(propertyName); } }