Commands/JSON/Import-Json.ps1

function Import-Json {
    <#
    
    .SYNOPSIS
        Imports json
    .DESCRIPTION
        Imports json files and outputs PowerShell objects
    .PARAMETER LiteralPath
        Specifies the path to the XML files.
        Unlike Path , the value of the LiteralPath parameter is used exactly as it's typed.
        No characters are interpreted as wildcards.
        If the path includes escape characters, enclose it in single quotation marks.
        Single quotation marks tell PowerShell not to interpret any characters as escape sequences.
    .PARAMETER Path
        Specifies the path to the XML files.
    .PARAMETER First
        Gets only the specified number of objects. Enter the number of objects to get.
    .PARAMETER Skip
        Ignores the specified number of objects and then gets the remaining objects. Enter the number of objects to skip.
    
    #>

            
    [CmdletBinding(SupportsPaging)]    

    param(
    # The delimiter between objects.
    # If a delimiter is provided, the content will be split by this delimeter.
    [Parameter(ValueFromPipelineByPropertyName)]
    [string]
    $Delimiter,

    [Parameter(ParameterSetName='ByPath', Mandatory=$true, Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
    [string[]]
    ${Path},

    [Parameter(ParameterSetName='ByLiteralPath', Mandatory=$true, ValueFromPipelineByPropertyName=$true)]
    [Alias('PSPath','LP')]
    [string[]]
    ${LiteralPath}
    )
    dynamicParam {
    $baseCommand = 
        if (-not $script:ImportClixml) {
            $script:ImportClixml = 
                $executionContext.SessionState.InvokeCommand.GetCommand('Import-Clixml','Cmdlet')
            $script:ImportClixml
        } else {
            $script:ImportClixml
        }
    $IncludeParameter = @()
    $ExcludeParameter = 'IncludeTotalCount'

    }
        process {
        $FileSplat = [Ordered]@{}
    
        if ($path) { $FileSplat['Path'] = $path}
        elseif ($literalPath) { $FileSplat['LiteralPath'] = $path = $literalPath }

        $fileContent = Get-Content @FileSplat -Raw
        if (-not $fileContent) { return }
        
        if ($Delimiter) {
            foreach ($delimitedSegment in 
                $fileContent -split "(?<=[\]\}])$([Regex]::Escape($Delimiter))(?=[\[\{])"
            ) {
                try {
                    $delimitedSegment | ConvertFrom-Json
                } catch {
                    Write-Error "'$($path)': $($_.Exception.Message)" -TargetObject $delimitedSegment                                    
                }
            }
        } else {
            try {
                $fileContent | ConvertFrom-Json
            } catch {
                Write-Error "'$($path)': $($_.Exception.Message)" -TargetObject $fileContent
                return                
            }
        }
    
    }
}