in src/PSRule/Common/JsonConverters.cs [184:241]
private static PSObject ReadObject(JsonReader reader, bool bindTargetInfo, TargetSourceInfo sourceInfo)
{
if (reader.TokenType != JsonToken.StartObject || !reader.Read())
throw new PipelineSerializationException(PSRuleResources.ReadJsonFailed);
var result = new PSObject();
string name = null;
var lineNumber = 0;
var linePosition = 0;
if (bindTargetInfo && reader is IJsonLineInfo lineInfo && lineInfo.HasLineInfo())
{
lineNumber = lineInfo.LineNumber;
linePosition = lineInfo.LinePosition;
}
// Read each token
while (reader.TokenType != JsonToken.EndObject)
{
switch (reader.TokenType)
{
case JsonToken.PropertyName:
name = reader.Value.ToString();
if (name == PSRuleTargetInfo.PropertyName)
{
var targetInfo = ReadInfo(reader);
if (targetInfo != null)
result.SetTargetInfo(targetInfo);
}
break;
case JsonToken.StartObject:
var value = ReadObject(reader, bindTargetInfo: false, sourceInfo: null);
result.Properties.Add(new PSNoteProperty(name, value: value));
break;
case JsonToken.StartArray:
var items = ReadArray(reader: reader);
result.Properties.Add(new PSNoteProperty(name, value: items));
break;
case JsonToken.Comment:
break;
default:
result.Properties.Add(new PSNoteProperty(name, value: reader.Value));
break;
}
if (!reader.Read() || reader.TokenType == JsonToken.None)
throw new PipelineSerializationException(PSRuleResources.ReadJsonFailed);
}
if (bindTargetInfo)
{
result.UseTargetInfo(out var info);
info.SetSource(sourceInfo?.File, lineNumber, linePosition);
}
return result;
}