├── .github ├── ISSUE_TEMPLATE │ └── bug_report.md └── workflows │ └── dotnetcore.yml ├── .gitignore ├── JsonFlatten.Tests ├── JsonExtensionsTests.cs ├── JsonFlatten.Tests.csproj ├── Properties │ └── AssemblyInfo.cs ├── SampleJson │ ├── Complex.json │ ├── PathWithDotNotation.json │ └── Simple.json ├── app.config └── packages.config ├── JsonFlatten.sln ├── JsonFlatten ├── JsonExtensions.cs └── JsonFlatten.csproj ├── LICENSE ├── Publish-NuGetPackage.ps1 └── README.md /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug Report 3 | about: Report a problem to help us improve 4 | title: '[BUG]: Brief description' 5 | labels: bug 6 | assignees: '' 7 | --- 8 | 9 | **Describe the bug** 10 | 11 | < *A clear and concise description of the bug. >* 12 | 13 | **Example of the bug** 14 | 15 | < *Please fork: https://dotnetfiddle.net/jYghhm. Update it to demonstrate the bug. Save it and add the link here.* > 16 | -------------------------------------------------------------------------------- /.github/workflows/dotnetcore.yml: -------------------------------------------------------------------------------- 1 | name: .NET Core 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v2 16 | - name: Setup .NET Core 17 | uses: actions/setup-dotnet@v1 18 | with: 19 | dotnet-version: 3.1.101 20 | - name: Install dependencies 21 | run: dotnet restore 22 | - name: Build 23 | run: dotnet build --configuration Release --no-restore 24 | - name: Test 25 | run: dotnet test --no-restore --verbosity normal 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.suo 8 | *.user 9 | *.userosscache 10 | *.sln.docstates 11 | 12 | # User-specific files (MonoDevelop/Xamarin Studio) 13 | *.userprefs 14 | 15 | # Build results 16 | [Dd]ebug/ 17 | [Dd]ebugPublic/ 18 | [Rr]elease/ 19 | [Rr]eleases/ 20 | x64/ 21 | x86/ 22 | bld/ 23 | [Bb]in/ 24 | [Oo]bj/ 25 | [Ll]og/ 26 | 27 | # Visual Studio 2015/2017 cache/options directory 28 | .vs/ 29 | # Uncomment if you have tasks that create the project's static files in wwwroot 30 | #wwwroot/ 31 | 32 | # Visual Studio 2017 auto generated files 33 | Generated\ Files/ 34 | 35 | # MSTest test Results 36 | [Tt]est[Rr]esult*/ 37 | [Bb]uild[Ll]og.* 38 | 39 | # NUNIT 40 | *.VisualState.xml 41 | TestResult.xml 42 | 43 | # Build Results of an ATL Project 44 | [Dd]ebugPS/ 45 | [Rr]eleasePS/ 46 | dlldata.c 47 | 48 | # Benchmark Results 49 | BenchmarkDotNet.Artifacts/ 50 | 51 | # .NET Core 52 | project.lock.json 53 | project.fragment.lock.json 54 | artifacts/ 55 | **/Properties/launchSettings.json 56 | 57 | # StyleCop 58 | StyleCopReport.xml 59 | 60 | # Files built by Visual Studio 61 | *_i.c 62 | *_p.c 63 | *_i.h 64 | *.ilk 65 | *.meta 66 | *.obj 67 | *.iobj 68 | *.pch 69 | *.pdb 70 | *.ipdb 71 | *.pgc 72 | *.pgd 73 | *.rsp 74 | *.sbr 75 | *.tlb 76 | *.tli 77 | *.tlh 78 | *.tmp 79 | *.tmp_proj 80 | *.log 81 | *.vspscc 82 | *.vssscc 83 | .builds 84 | *.pidb 85 | *.svclog 86 | *.scc 87 | 88 | # Chutzpah Test files 89 | _Chutzpah* 90 | 91 | # Visual C++ cache files 92 | ipch/ 93 | *.aps 94 | *.ncb 95 | *.opendb 96 | *.opensdf 97 | *.sdf 98 | *.cachefile 99 | *.VC.db 100 | *.VC.VC.opendb 101 | 102 | # Visual Studio profiler 103 | *.psess 104 | *.vsp 105 | *.vspx 106 | *.sap 107 | 108 | # Visual Studio Trace Files 109 | *.e2e 110 | 111 | # TFS 2012 Local Workspace 112 | $tf/ 113 | 114 | # Guidance Automation Toolkit 115 | *.gpState 116 | 117 | # ReSharper is a .NET coding add-in 118 | _ReSharper*/ 119 | *.[Rr]e[Ss]harper 120 | *.DotSettings.user 121 | 122 | # JustCode is a .NET coding add-in 123 | .JustCode 124 | 125 | # TeamCity is a build add-in 126 | _TeamCity* 127 | 128 | # DotCover is a Code Coverage Tool 129 | *.dotCover 130 | 131 | # AxoCover is a Code Coverage Tool 132 | .axoCover/* 133 | !.axoCover/settings.json 134 | 135 | # Visual Studio code coverage results 136 | *.coverage 137 | *.coveragexml 138 | 139 | # NCrunch 140 | _NCrunch_* 141 | .*crunch*.local.xml 142 | nCrunchTemp_* 143 | 144 | # MightyMoose 145 | *.mm.* 146 | AutoTest.Net/ 147 | 148 | # Web workbench (sass) 149 | .sass-cache/ 150 | 151 | # Installshield output folder 152 | [Ee]xpress/ 153 | 154 | # DocProject is a documentation generator add-in 155 | DocProject/buildhelp/ 156 | DocProject/Help/*.HxT 157 | DocProject/Help/*.HxC 158 | DocProject/Help/*.hhc 159 | DocProject/Help/*.hhk 160 | DocProject/Help/*.hhp 161 | DocProject/Help/Html2 162 | DocProject/Help/html 163 | 164 | # Click-Once directory 165 | publish/ 166 | 167 | # Publish Web Output 168 | *.[Pp]ublish.xml 169 | *.azurePubxml 170 | # Note: Comment the next line if you want to checkin your web deploy settings, 171 | # but database connection strings (with potential passwords) will be unencrypted 172 | *.pubxml 173 | *.publishproj 174 | 175 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 176 | # checkin your Azure Web App publish settings, but sensitive information contained 177 | # in these scripts will be unencrypted 178 | PublishScripts/ 179 | 180 | # NuGet Packages 181 | *.nupkg 182 | # The packages folder can be ignored because of Package Restore 183 | **/[Pp]ackages/* 184 | # except build/, which is used as an MSBuild target. 185 | !**/[Pp]ackages/build/ 186 | # Uncomment if necessary however generally it will be regenerated when needed 187 | #!**/[Pp]ackages/repositories.config 188 | # NuGet v3's project.json files produces more ignorable files 189 | *.nuget.props 190 | *.nuget.targets 191 | 192 | # Microsoft Azure Build Output 193 | csx/ 194 | *.build.csdef 195 | 196 | # Microsoft Azure Emulator 197 | ecf/ 198 | rcf/ 199 | 200 | # Windows Store app package directories and files 201 | AppPackages/ 202 | BundleArtifacts/ 203 | Package.StoreAssociation.xml 204 | _pkginfo.txt 205 | *.appx 206 | 207 | # Visual Studio cache files 208 | # files ending in .cache can be ignored 209 | *.[Cc]ache 210 | # but keep track of directories ending in .cache 211 | !*.[Cc]ache/ 212 | 213 | # Others 214 | ClientBin/ 215 | ~$* 216 | *~ 217 | *.dbmdl 218 | *.dbproj.schemaview 219 | *.jfm 220 | *.pfx 221 | *.publishsettings 222 | orleans.codegen.cs 223 | 224 | # Including strong name files can present a security risk 225 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 226 | #*.snk 227 | 228 | # Since there are multiple workflows, uncomment next line to ignore bower_components 229 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 230 | #bower_components/ 231 | 232 | # RIA/Silverlight projects 233 | Generated_Code/ 234 | 235 | # Backup & report files from converting an old project file 236 | # to a newer Visual Studio version. Backup files are not needed, 237 | # because we have git ;-) 238 | _UpgradeReport_Files/ 239 | Backup*/ 240 | UpgradeLog*.XML 241 | UpgradeLog*.htm 242 | ServiceFabricBackup/ 243 | *.rptproj.bak 244 | 245 | # SQL Server files 246 | *.mdf 247 | *.ldf 248 | *.ndf 249 | 250 | # Business Intelligence projects 251 | *.rdl.data 252 | *.bim.layout 253 | *.bim_*.settings 254 | *.rptproj.rsuser 255 | 256 | # Microsoft Fakes 257 | FakesAssemblies/ 258 | 259 | # GhostDoc plugin setting file 260 | *.GhostDoc.xml 261 | 262 | # Node.js Tools for Visual Studio 263 | .ntvs_analysis.dat 264 | node_modules/ 265 | 266 | # Visual Studio 6 build log 267 | *.plg 268 | 269 | # Visual Studio 6 workspace options file 270 | *.opt 271 | 272 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 273 | *.vbw 274 | 275 | # Visual Studio LightSwitch build output 276 | **/*.HTMLClient/GeneratedArtifacts 277 | **/*.DesktopClient/GeneratedArtifacts 278 | **/*.DesktopClient/ModelManifest.xml 279 | **/*.Server/GeneratedArtifacts 280 | **/*.Server/ModelManifest.xml 281 | _Pvt_Extensions 282 | 283 | # Paket dependency manager 284 | .paket/paket.exe 285 | paket-files/ 286 | 287 | # FAKE - F# Make 288 | .fake/ 289 | 290 | # JetBrains Rider 291 | .idea/ 292 | *.sln.iml 293 | 294 | # CodeRush 295 | .cr/ 296 | 297 | # Python Tools for Visual Studio (PTVS) 298 | __pycache__/ 299 | *.pyc 300 | 301 | # Cake - Uncomment if you are using it 302 | # tools/** 303 | # !tools/packages.config 304 | 305 | # Tabs Studio 306 | *.tss 307 | 308 | # Telerik's JustMock configuration file 309 | *.jmconfig 310 | 311 | # BizTalk build output 312 | *.btp.cs 313 | *.btm.cs 314 | *.odx.cs 315 | *.xsd.cs 316 | 317 | # OpenCover UI analysis results 318 | OpenCover/ 319 | 320 | # Azure Stream Analytics local run output 321 | ASALocalRun/ 322 | 323 | # MSBuild Binary and Structured Log 324 | *.binlog 325 | 326 | # NVidia Nsight GPU debugger configuration file 327 | *.nvuser 328 | 329 | # MFractors (Xamarin productivity tool) working folder 330 | .mfractor/ 331 | -------------------------------------------------------------------------------- /JsonFlatten.Tests/JsonExtensionsTests.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using Newtonsoft.Json.Linq; 5 | using Xunit; 6 | using Xunit.Priority; 7 | 8 | namespace JsonFlatten.Tests; 9 | 10 | public class JsonFlattenFixture 11 | { 12 | private static readonly string FilePath = 13 | Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, @"..\..\SampleJson\")); 14 | 15 | public JObject SimpleJson { get; } = JObject.Parse(File.ReadAllText($"{FilePath}Simple.json")); 16 | public JObject ComplexJson { get; } = JObject.Parse(File.ReadAllText($"{FilePath}Complex.json")); 17 | 18 | public JObject PathWithDotNotationJson { get; } = 19 | JObject.Parse(File.ReadAllText($"{FilePath}PathWithDotNotation.json")); 20 | 21 | public IDictionary FlattenedSimpleJson { get; set; } 22 | public IDictionary FlattenedComplexJson { get; set; } 23 | public IDictionary FlattenedPathWithDotNotationJson { get; set; } 24 | public IDictionary FlattenedSimpleJsonWithoutEmpty { get; set; } 25 | public IDictionary FlattenedComplexJsonWithoutEmpty { get; set; } 26 | } 27 | 28 | [TestCaseOrderer(PriorityOrderer.Name, PriorityOrderer.Assembly)] 29 | public class JsonExtensionsTests : IClassFixture 30 | { 31 | private readonly JsonFlattenFixture _fixture; 32 | 33 | public JsonExtensionsTests(JsonFlattenFixture fixture) 34 | { 35 | _fixture = fixture; 36 | } 37 | 38 | [Fact, Priority(1)] 39 | public void Can_flatten_a_JObject() 40 | { 41 | _fixture.FlattenedSimpleJson = _fixture.SimpleJson.Flatten(); 42 | _fixture.FlattenedComplexJson = _fixture.ComplexJson.Flatten(); 43 | _fixture.FlattenedPathWithDotNotationJson = _fixture.PathWithDotNotationJson.Flatten(); 44 | _fixture.FlattenedSimpleJsonWithoutEmpty = _fixture.SimpleJson.Flatten(includeNullAndEmptyValues: false); 45 | _fixture.FlattenedComplexJsonWithoutEmpty = _fixture.ComplexJson.Flatten(includeNullAndEmptyValues: false); 46 | } 47 | 48 | [Fact] 49 | public void Flattened_JObject_has_correct_values() 50 | { 51 | Assert.Equal("Hello World", _fixture.FlattenedSimpleJson.Get("string")); 52 | Assert.Equal(123, _fixture.FlattenedSimpleJson.Get("number")); 53 | Assert.Equal(DateTime.Parse("2014-01-01T23:28:56.782Z").ToUniversalTime(), 54 | _fixture.FlattenedSimpleJson.Get("date")); 55 | Assert.True(_fixture.FlattenedSimpleJson.Get("boolean")); 56 | Assert.Equal("b", _fixture.FlattenedSimpleJson.Get("object.a")); 57 | Assert.Equal(1, _fixture.FlattenedSimpleJson.Get("array[0]")); 58 | 59 | Assert.Equal("numeric node", _fixture.FlattenedSimpleJson.Get("1")); 60 | Assert.Equal(123, _fixture.FlattenedSimpleJson.Get("Data.Data.Dimensions.-00705309.Width.Min")); 61 | 62 | Assert.Equal("", _fixture.FlattenedComplexJson.Get("posts[0].featured_image")); 63 | Assert.Null(_fixture.FlattenedComplexJson.Get("posts[0].post_thumbnail")); 64 | Assert.Equal(System.Linq.Enumerable.Empty(), 65 | _fixture.FlattenedComplexJson.Get("posts[0].publicize_URLs")); 66 | Assert.NotStrictEqual(new object(), _fixture.FlattenedComplexJson.Get("posts[0].tags")); 67 | 68 | Assert.Equal(123, 69 | _fixture.FlattenedPathWithDotNotationJson.Get("outer['inner.path']['another.inner.path']")); 70 | Assert.Equal(2, 71 | _fixture.FlattenedPathWithDotNotationJson.Get( 72 | "outer['inner.path']['another.inner.path.array'][0].numbers[1]")); 73 | } 74 | 75 | [Fact] 76 | public void Flattened_JObject_with_includeNullAndEmptyValues_flag_as_false_should_not_have_certain_properties() 77 | { 78 | Assert.Throws(() => _fixture.FlattenedSimpleJsonWithoutEmpty.Get("null")); 79 | Assert.Throws(() => 80 | _fixture.FlattenedSimpleJsonWithoutEmpty.Get("emptyString")); 81 | Assert.Throws(() => 82 | _fixture.FlattenedSimpleJsonWithoutEmpty.Get("emptyObject")); 83 | Assert.Throws( 84 | () => _fixture.FlattenedSimpleJsonWithoutEmpty.Get("emptyArray")); 85 | 86 | Assert.Throws(() => 87 | _fixture.FlattenedComplexJsonWithoutEmpty.Get("posts[0].featured_image")); 88 | Assert.Throws(() => 89 | _fixture.FlattenedComplexJsonWithoutEmpty.Get("posts[0].post_thumbnail")); 90 | Assert.Throws(() => 91 | _fixture.FlattenedComplexJsonWithoutEmpty.Get("posts[0].publicize_URLs")); 92 | Assert.Throws(() => 93 | _fixture.FlattenedComplexJsonWithoutEmpty.Get("posts[0].tags")); 94 | } 95 | 96 | [Fact] 97 | private void Flattened_JObject_without_empty_values_has_correct_number_of_properties() 98 | { 99 | Assert.Equal(12, _fixture.FlattenedSimpleJsonWithoutEmpty.Count); 100 | Assert.Equal(782, _fixture.FlattenedComplexJsonWithoutEmpty.Count); 101 | } 102 | 103 | [Fact] 104 | private void Flattened_JObject_has_correct_number_of_properties() 105 | { 106 | Assert.Equal(16, _fixture.FlattenedSimpleJson.Count); 107 | Assert.Equal(879, _fixture.FlattenedComplexJson.Count); 108 | Assert.Equal(8, _fixture.FlattenedPathWithDotNotationJson.Count); 109 | } 110 | 111 | [Fact] 112 | private void Can_cast_to_correct_types_when_retrieving_values() 113 | { 114 | Assert.True(_fixture.FlattenedSimpleJson.Get("string").GetType() == typeof(string)); 115 | Assert.True(_fixture.FlattenedSimpleJson.Get("number").GetType() == typeof(long)); 116 | Assert.True(_fixture.FlattenedSimpleJson.Get("date").GetType() == typeof(DateTime)); 117 | Assert.True(_fixture.FlattenedSimpleJson.Get("boolean").GetType() == typeof(bool)); 118 | Assert.True(_fixture.FlattenedSimpleJson.Get("object.a").GetType() == typeof(string)); 119 | Assert.True(_fixture.FlattenedSimpleJson.Get("array[0]").GetType() == typeof(long)); 120 | } 121 | 122 | [Fact] 123 | private void Can_unflatten_a_flattened_dictionary() 124 | { 125 | Assert.IsType(_fixture.FlattenedSimpleJson.Unflatten()); 126 | Assert.IsType(_fixture.FlattenedComplexJson.Unflatten()); 127 | Assert.IsType(_fixture.FlattenedPathWithDotNotationJson.Unflatten()); 128 | Assert.IsType(_fixture.FlattenedSimpleJsonWithoutEmpty.Unflatten()); 129 | Assert.IsType(_fixture.FlattenedComplexJsonWithoutEmpty.Unflatten()); 130 | } 131 | 132 | [Fact] 133 | private void Unflattening_a_flattened_dictionary_equals_original_JObject() 134 | { 135 | Assert.True(JToken.DeepEquals(_fixture.FlattenedSimpleJson.Unflatten(), _fixture.SimpleJson)); 136 | Assert.True(JToken.DeepEquals(_fixture.FlattenedComplexJson.Unflatten(), _fixture.ComplexJson)); 137 | Assert.True(JToken.DeepEquals(_fixture.FlattenedPathWithDotNotationJson.Unflatten(), 138 | _fixture.PathWithDotNotationJson)); 139 | } 140 | } -------------------------------------------------------------------------------- /JsonFlatten.Tests/JsonFlatten.Tests.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Debug 7 | AnyCPU 8 | {D698B899-C670-4A4D-BAB8-1575C1974BAC} 9 | Library 10 | Properties 11 | JsonFlatten.Tests 12 | JsonFlatten.Tests 13 | v4.7.2 14 | 512 15 | {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 16 | 10.0 17 | $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) 18 | $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages 19 | False 20 | UnitTest 21 | 22 | 23 | 24 | 10 25 | 26 | 27 | true 28 | full 29 | false 30 | bin\Debug\ 31 | DEBUG;TRACE 32 | prompt 33 | 4 34 | 35 | 36 | pdbonly 37 | true 38 | bin\Release\ 39 | TRACE 40 | prompt 41 | 4 42 | 43 | 44 | 45 | 46 | ..\packages\Microsoft.TestPlatform.ObjectModel.17.10.0\lib\net462\Microsoft.TestPlatform.CoreUtilities.dll 47 | 48 | 49 | ..\packages\Microsoft.TestPlatform.ObjectModel.17.10.0\lib\net462\Microsoft.TestPlatform.PlatformAbstractions.dll 50 | 51 | 52 | ..\packages\Microsoft.TestPlatform.ObjectModel.17.10.0\lib\net462\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll 53 | 54 | 55 | ..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll 56 | 57 | 58 | 59 | ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll 60 | 61 | 62 | ..\packages\System.Collections.Immutable.8.0.0\lib\net462\System.Collections.Immutable.dll 63 | 64 | 65 | 66 | ..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll 67 | 68 | 69 | 70 | ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll 71 | 72 | 73 | ..\packages\System.Reflection.Metadata.8.0.0\lib\net462\System.Reflection.Metadata.dll 74 | 75 | 76 | 77 | ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll 78 | 79 | 80 | 81 | 82 | ..\packages\xunit.abstractions.2.0.3\lib\net35\xunit.abstractions.dll 83 | 84 | 85 | ..\packages\xunit.assert.2.9.0\lib\netstandard1.1\xunit.assert.dll 86 | 87 | 88 | ..\packages\xunit.extensibility.core.2.9.0\lib\net452\xunit.core.dll 89 | 90 | 91 | ..\packages\xunit.extensibility.execution.2.9.0\lib\net452\xunit.execution.desktop.dll 92 | 93 | 94 | ..\packages\Xunit.Priority.1.1.6\lib\net452\Xunit.Priority.dll 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | {c1df78a2-acee-42ab-8020-0289c6e2b26c} 119 | JsonFlatten 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | False 131 | 132 | 133 | False 134 | 135 | 136 | False 137 | 138 | 139 | False 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. 149 | 150 | 151 | 152 | 153 | 154 | 155 | 162 | -------------------------------------------------------------------------------- /JsonFlatten.Tests/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("JsonFlatten.Tests")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("JsonFlatten.Tests")] 13 | [assembly: AssemblyCopyright("Copyright © 2019")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("d698b899-c670-4a4d-bab8-1575c1974bac")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /JsonFlatten.Tests/SampleJson/Complex.json: -------------------------------------------------------------------------------- 1 | { 2 | "found": 12, 3 | "posts": [ 4 | { 5 | "ID": 33, 6 | "site_ID": 39449079, 7 | "author": { 8 | "ID": 38890122, 9 | "login": "wtmpeachtest", 10 | "email": false, 11 | "name": "wtmpeachtest", 12 | "first_name": "", 13 | "last_name": "", 14 | "nice_name": "wtmpeachtest", 15 | "URL": "http://wtmpeachtest.wordpress.com", 16 | "avatar_URL": "https://1.gravatar.com/avatar/d26a62ad77067c05bf30794ddb65768e?s=96&d=identicon&r=G", 17 | "profile_URL": "https://en.gravatar.com/wtmpeachtest", 18 | "ip_address": false, 19 | "site_ID": 39449079, 20 | "site_visible": true 21 | }, 22 | "date": "2012-09-05T00:26:50+00:00", 23 | "modified": "2012-09-05T00:26:50+00:00", 24 | "title": "dozen", 25 | "URL": "https://wtmpeachtest.wordpress.com/2012/09/05/dozen/", 26 | "short_URL": "https://wp.me/s2Fwvt-dozen", 27 | "content": "

Till the one day when the lady met this fellow and they knew it was much more than a hunch. Flying away on a wing and a prayer. Who could it be? Believe it or not its just me. Just good ol boys Wouldnt change if they could. Fightin the system like a true modern day Robin Hood. Just the good ol boys Never meanin no harm. Beats all youve ever saw been in trouble with the law since the day they was born. Sunday Monday Happy Days. Tuesday Wednesday Happy Days. Thursday Friday Happy Days.Saturday what a day. Groovin all week with you.

\n

Its mission – to explore strange new worlds to seek out new life and new civilizations to boldly go where no man has gone before. Boy the way Glen Miller played. Songs that made the hit parade. Guys like us we had it made. Those were the days. All of them had hair of gold like their mother the youngest one in curls. Go Speed Racer. Go Speed Racer. Go Speed Racer go! Baby if youve ever wondered – wondered whatever became of me. Im living on the air in Cincinnati. Cincinnati WKRP. Doin it our way. There�s nothing we wont try. Never heard the word impossible. This time theres no stopping us? Come and listen to a story about a man named Jed – a poor mountaineer barely kept his family fed. Well were movin on up to the east side to a deluxe apartment in the sky. The year is 1987 and NASA launches the last of Americas deep space probes? A man is born hes a man of means. Then along come two they got nothing but their jeans? Its mission – to explore strange new worlds to seek out new life and new civilizations to boldly go where no man has gone before. Just sit right back and youll hear a tale a tale of a fateful trip that started from this tropic port aboard this tiny ship. Heres the story of a man named Brady who was busy with three boys of his own. The movie star the professor and Mary Ann here on Gilligans Isle. And if you threw a party – invited everyone you knew. You would see the biggest gift would be from me and the card attached would say thank you for being a friend.

\n

Go Speed Racer. Go Speed Racer. Go Speed Racer go! Michael Knight a young loner on a crusade to champion the cause of the innocent the helpless the powerless in a world of criminals who operate above the law! And well do it our way yes our way. Make all our dreams come true for me and you. I have always wanted to have a neighbor just like you. Ive always wanted to live in a neighborhood with you. Wouldnt you like to get away? Sometimes you want to go where everybody knows your name. And theyre always glad you came?

\n

The weather started getting rough – the tiny ship was tossed. If not for the courage of the fearless crew the Minnow would be lost. the Minnow would be lost. we might as well say… Would you be mine? Could you be mine? Wont you be my neighbor. Movin on up to the east side. We finally got a piece of the pie.

\n

Thank you for being a friend. Travelled down the road and back again.Your heart is true youre a pal and a confident? Texas tea. In 1972 a crack commando unit was sent to prison by a military court for a crime they didnt commit. These men promptly escaped from a maximum security stockade to the Los Angeles underground. These Happy Days are yours and mine Happy Days. Baby if youve ever wondered – wondered whatever became of me. Im living on the air in Cincinnati. Cincinnati WKRP. The first mate and his Skipper too will do their very best to make the others comfterble in their tropic island nest.

\n", 28 | "excerpt": "

Till the one day when the lady met this fellow and they knew it was much more than a hunch. Flying away on a wing and a prayer. Who could it be? Believe it or not its just me. Just good ol boys Wouldnt change if they could. Fightin the system like a true modern […]

\n", 29 | "slug": "dozen", 30 | "guid": "http://wtmpeachtest.wordpress.com/?p=33", 31 | "status": "publish", 32 | "sticky": false, 33 | "password": "", 34 | "parent": false, 35 | "type": "post", 36 | "comments_open": true, 37 | "pings_open": true, 38 | "likes_enabled": true, 39 | "sharing_enabled": true, 40 | "comment_count": 0, 41 | "like_count": 0, 42 | "i_like": false, 43 | "is_reblogged": false, 44 | "is_following": false, 45 | "global_ID": "94a71f456252f6a0d032c800a0e728eb", 46 | "featured_image": "", 47 | "post_thumbnail": null, 48 | "format": "standard", 49 | "geo": false, 50 | "menu_order": 0, 51 | "publicize_URLs": [ 52 | 53 | ], 54 | "tags": { 55 | }, 56 | "categories": { 57 | "goat": { 58 | "ID": 236920, 59 | "name": "goat", 60 | "slug": "goat", 61 | "description": "goat category", 62 | "post_count": 6, 63 | "feed_url": "https://wtmpeachtest.wordpress.com/category/goat/feed/", 64 | "parent": 0, 65 | "meta": { 66 | "links": { 67 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goat", 68 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goat/help", 69 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079" 70 | } 71 | } 72 | }, 73 | "goatchild": { 74 | "ID": 110114553, 75 | "name": "goatchild", 76 | "slug": "goatchild", 77 | "description": "child of goat category", 78 | "post_count": 5, 79 | "feed_url": "https://wtmpeachtest.wordpress.com/category/goat/goatchild/feed/", 80 | "parent": 236920, 81 | "meta": { 82 | "links": { 83 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goatchild", 84 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goatchild/help", 85 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079" 86 | } 87 | } 88 | }, 89 | "hobo": { 90 | "ID": 330835, 91 | "name": "hobo", 92 | "slug": "hobo", 93 | "description": "hobo category", 94 | "post_count": 5, 95 | "feed_url": "https://wtmpeachtest.wordpress.com/category/hobo/feed/", 96 | "parent": 0, 97 | "meta": { 98 | "links": { 99 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:hobo", 100 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:hobo/help", 101 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079" 102 | } 103 | } 104 | } 105 | }, 106 | "attachments": { 107 | }, 108 | "metadata": false, 109 | "meta": { 110 | "links": { 111 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/33", 112 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/33/help", 113 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079", 114 | "replies": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/33/replies/", 115 | "likes": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/33/likes/" 116 | } 117 | }, 118 | "current_user_can": { 119 | "publish_post": false, 120 | "delete_post": false, 121 | "edit_post": false 122 | }, 123 | "capabilities": { 124 | "publish_post": false, 125 | "delete_post": false, 126 | "edit_post": false 127 | } 128 | }, 129 | { 130 | "ID": 31, 131 | "site_ID": 39449079, 132 | "author": { 133 | "ID": 38890122, 134 | "login": "wtmpeachtest", 135 | "email": false, 136 | "name": "wtmpeachtest", 137 | "first_name": "", 138 | "last_name": "", 139 | "nice_name": "wtmpeachtest", 140 | "URL": "http://wtmpeachtest.wordpress.com", 141 | "avatar_URL": "https://1.gravatar.com/avatar/d26a62ad77067c05bf30794ddb65768e?s=96&d=identicon&r=G", 142 | "profile_URL": "https://en.gravatar.com/wtmpeachtest", 143 | "ip_address": false, 144 | "site_ID": 39449079, 145 | "site_visible": true 146 | }, 147 | "date": "2012-09-05T00:25:51+00:00", 148 | "modified": "2012-09-05T00:25:51+00:00", 149 | "title": "Samuel Motherfucking Ipsum", 150 | "URL": "https://wtmpeachtest.wordpress.com/2012/09/05/samuel-motherfucking-ipsum/", 151 | "short_URL": "https://wp.me/p2Fwvt-v", 152 | "content": "

The path of the righteous man is beset on all sides by the iniquities of the selfish and the tyranny of evil men. Blessed is he who, in the name of charity and good will, shepherds the weak through the valley of darkness, for he is truly his brother’s keeper and the finder of lost children. And I will strike down upon thee with great vengeance and furious anger those who would attempt to poison and destroy My brothers. And you will know My name is the Lord when I lay My vengeance upon thee.

\n

Do you see any Teletubbies in here? Do you see a slender plastic tag clipped to my shirt with my name printed on it? Do you see a little Asian child with a blank expression on his face sitting outside on a mechanical helicopter that shakes when you put quarters in it? No? Well, that’s what you see at a toy store. And you must think you’re in a toy store, because you’re here shopping for an infant named Jeb.

\n

Now that there is the Tec-9, a crappy spray gun from South Miami. This gun is advertised as the most popular gun in American crime. Do you believe that shit? It actually says that in the little book that comes with it: the most popular gun in American crime. Like they’re actually proud of that shit.

\n

Now that we know who you are, I know who I am. I’m not a mistake! It all makes sense! In a comic, you know how you can tell who the arch-villain’s going to be? He’s the exact opposite of the hero. And most times they’re friends, like you and me! I should’ve known way back when… You know why, David? Because of the kids. They called me Mr Glass.

\n

Your bones don’t break, mine do. That’s clear. Your cells react to bacteria and viruses differently than mine. You don’t get sick, I do. That’s also clear. But for some reason, you and I react the exact same way to water. We swallow it too fast, we choke. We get some in our lungs, we drown. However unreal it may seem, we are connected, you and I. We’re on the same curve, just on opposite ends.

\n

Your bones don’t break, mine do. That’s clear. Your cells react to bacteria and viruses differently than mine. You don’t get sick, I do. That’s also clear. But for some reason, you and I react the exact same way to water. We swallow it too fast, we choke. We get some in our lungs, we drown. However unreal it may seem, we are connected, you and I. We’re on the same curve, just on opposite ends.

\n

<!–

\n", 153 | "excerpt": "

The path of the righteous man is beset on all sides by the iniquities of the selfish and the tyranny of evil men. Blessed is he who, in the name of charity and good will, shepherds the weak through the valley of darkness, for he is truly his brother’s keeper and the finder of lost […]

\n", 154 | "slug": "samuel-motherfucking-ipsum", 155 | "guid": "http://wtmpeachtest.wordpress.com/?p=31", 156 | "status": "publish", 157 | "sticky": false, 158 | "password": "", 159 | "parent": false, 160 | "type": "post", 161 | "comments_open": true, 162 | "pings_open": true, 163 | "likes_enabled": true, 164 | "sharing_enabled": true, 165 | "comment_count": 0, 166 | "like_count": 0, 167 | "i_like": false, 168 | "is_reblogged": false, 169 | "is_following": false, 170 | "global_ID": "8f38889a411b38a40d8958bfc473ae7e", 171 | "featured_image": "", 172 | "post_thumbnail": null, 173 | "format": "standard", 174 | "geo": false, 175 | "menu_order": 0, 176 | "publicize_URLs": [ 177 | 178 | ], 179 | "tags": { 180 | }, 181 | "categories": { 182 | "goat": { 183 | "ID": 236920, 184 | "name": "goat", 185 | "slug": "goat", 186 | "description": "goat category", 187 | "post_count": 6, 188 | "feed_url": "https://wtmpeachtest.wordpress.com/category/goat/feed/", 189 | "parent": 0, 190 | "meta": { 191 | "links": { 192 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goat", 193 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goat/help", 194 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079" 195 | } 196 | } 197 | } 198 | }, 199 | "attachments": { 200 | }, 201 | "metadata": false, 202 | "meta": { 203 | "links": { 204 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/31", 205 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/31/help", 206 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079", 207 | "replies": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/31/replies/", 208 | "likes": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/31/likes/" 209 | } 210 | }, 211 | "current_user_can": { 212 | "publish_post": false, 213 | "delete_post": false, 214 | "edit_post": false 215 | }, 216 | "capabilities": { 217 | "publish_post": false, 218 | "delete_post": false, 219 | "edit_post": false 220 | } 221 | }, 222 | { 223 | "ID": 29, 224 | "site_ID": 39449079, 225 | "author": { 226 | "ID": 38890122, 227 | "login": "wtmpeachtest", 228 | "email": false, 229 | "name": "wtmpeachtest", 230 | "first_name": "", 231 | "last_name": "", 232 | "nice_name": "wtmpeachtest", 233 | "URL": "http://wtmpeachtest.wordpress.com", 234 | "avatar_URL": "https://1.gravatar.com/avatar/d26a62ad77067c05bf30794ddb65768e?s=96&d=identicon&r=G", 235 | "profile_URL": "https://en.gravatar.com/wtmpeachtest", 236 | "ip_address": false, 237 | "site_ID": 39449079, 238 | "site_visible": true 239 | }, 240 | "date": "2012-09-05T00:24:35+00:00", 241 | "modified": "2012-09-05T00:24:35+00:00", 242 | "title": "ten", 243 | "URL": "https://wtmpeachtest.wordpress.com/2012/09/05/ten/", 244 | "short_URL": "https://wp.me/s2Fwvt-ten", 245 | "content": "

Liquor ipsum dolor sit amet glen keith nog-a-sake ut. Cardhu sapien, “cras: seagrams, sapien, sagittis.” Gordon’s massa porta agent orange pappy van winkle. Ullamcorper, aenean consequat blandit cuba libre paradise. Dolor blandit aliquet grant’s allt-�-bhainne mint julep; pellentesque hurricane quisque french 75. Greyhound gummy and coke, aptent nisl metus the amarosa cocktail accumsan auctor quisque ante old fashioned.

\n

Cointreau talisker mi godmother rhoncus jameson blair athol velit id, senectus caridan himenaeos old fashioned. Leo ac aliquet seven and seven.” Three wise men wolfschmitt eleifend augue, “balmenach leo grog,” primis ti punch; lemon split, diam, matador, urna, cactus jack quisque. Semper curabitur chicago cocktail pulvinar singapore sling, “justo, glenburgie snowball ardmore mauris ut nisi quent�o old mr. boston blandit glendronach vestibulum curae, speyburn.” Dui angel’s tit congue quisque, himenaeos bruichladdich northern comfort quisque margarita crown royal.

\n", 246 | "excerpt": "

Liquor ipsum dolor sit amet glen keith nog-a-sake ut. Cardhu sapien, “cras: seagrams, sapien, sagittis.” Gordon’s massa porta agent orange pappy van winkle. Ullamcorper, aenean consequat blandit cuba libre paradise. Dolor blandit aliquet grant’s allt-�-bhainne mint julep; pellentesque hurricane quisque french 75. Greyhound gummy and coke, aptent nisl metus the amarosa cocktail accumsan auctor quisque […]

\n", 247 | "slug": "ten", 248 | "guid": "http://wtmpeachtest.wordpress.com/?p=29", 249 | "status": "publish", 250 | "sticky": false, 251 | "password": "", 252 | "parent": false, 253 | "type": "post", 254 | "comments_open": true, 255 | "pings_open": true, 256 | "likes_enabled": true, 257 | "sharing_enabled": true, 258 | "comment_count": 0, 259 | "like_count": 0, 260 | "i_like": false, 261 | "is_reblogged": false, 262 | "is_following": false, 263 | "global_ID": "50c284639227297cec2a23bb46c0f4cb", 264 | "featured_image": "", 265 | "post_thumbnail": null, 266 | "format": "standard", 267 | "geo": false, 268 | "menu_order": 0, 269 | "publicize_URLs": [ 270 | 271 | ], 272 | "tags": { 273 | }, 274 | "categories": { 275 | "goat": { 276 | "ID": 236920, 277 | "name": "goat", 278 | "slug": "goat", 279 | "description": "goat category", 280 | "post_count": 6, 281 | "feed_url": "https://wtmpeachtest.wordpress.com/category/goat/feed/", 282 | "parent": 0, 283 | "meta": { 284 | "links": { 285 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goat", 286 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goat/help", 287 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079" 288 | } 289 | } 290 | }, 291 | "goatchild": { 292 | "ID": 110114553, 293 | "name": "goatchild", 294 | "slug": "goatchild", 295 | "description": "child of goat category", 296 | "post_count": 5, 297 | "feed_url": "https://wtmpeachtest.wordpress.com/category/goat/goatchild/feed/", 298 | "parent": 236920, 299 | "meta": { 300 | "links": { 301 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goatchild", 302 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goatchild/help", 303 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079" 304 | } 305 | } 306 | } 307 | }, 308 | "attachments": { 309 | }, 310 | "metadata": false, 311 | "meta": { 312 | "links": { 313 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/29", 314 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/29/help", 315 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079", 316 | "replies": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/29/replies/", 317 | "likes": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/29/likes/" 318 | } 319 | }, 320 | "current_user_can": { 321 | "publish_post": false, 322 | "delete_post": false, 323 | "edit_post": false 324 | }, 325 | "capabilities": { 326 | "publish_post": false, 327 | "delete_post": false, 328 | "edit_post": false 329 | } 330 | }, 331 | { 332 | "ID": 27, 333 | "site_ID": 39449079, 334 | "author": { 335 | "ID": 38890122, 336 | "login": "wtmpeachtest", 337 | "email": false, 338 | "name": "wtmpeachtest", 339 | "first_name": "", 340 | "last_name": "", 341 | "nice_name": "wtmpeachtest", 342 | "URL": "http://wtmpeachtest.wordpress.com", 343 | "avatar_URL": "https://1.gravatar.com/avatar/d26a62ad77067c05bf30794ddb65768e?s=96&d=identicon&r=G", 344 | "profile_URL": "https://en.gravatar.com/wtmpeachtest", 345 | "ip_address": false, 346 | "site_ID": 39449079, 347 | "site_visible": true 348 | }, 349 | "date": "2012-09-05T00:23:55+00:00", 350 | "modified": "2012-09-05T00:23:55+00:00", 351 | "title": "nine", 352 | "URL": "https://wtmpeachtest.wordpress.com/2012/09/05/nine/", 353 | "short_URL": "https://wp.me/s2Fwvt-nine", 354 | "content": "

Pollock rivuline hammerhead shark, clingfish, ghoul flashlight fish river loach; anglerfish sailbearer emperor angelfish; longjaw mudsucker. Zander Devario cod; angelfish conger eel blue eye cutthroat trout Australian lungfish dragon goby upside-down catfish channel catfish roundhead ground shark false moray.

\n

Porgy mudsucker, tompot blenny; sheatfish pirarucu sandbar shark hairtail fierasfer Blenny oarfish, poacher houndshark, “deepwater cardinalfish pufferfish.” Bluefin tuna Mexican golden trout, Blobfish Blacksmelt scabbard fish. European minnow blue gourami velvet-belly shark hamlet, garibaldi yellow-edged moray prickly shark driftfish brook lamprey ghost fish plaice jewel tetra. White shark burbot; freshwater eel salmon searobin armored searobin Black mackerel Atlantic silverside bonytongue quillback, “Redhorse sucker Mozambique tilapia tailor finback cat shark.” Poolfish grunt, herring sandfish Blind goby ridgehead spiny eel armorhead catfish barbeled houndshark. Capelin; zebra oto roosterfish houndshark.

\n

Bottlenose angelfish amago New Zealand smelt? Yellow-edged moray capelin streamer fish roanoke bass tommy ruff tarwhine sillago walleye pollock zebra oto Japanese eel, pelican eel. Moray eel eulachon thornfish bull trout Raccoon butterfly fish emperor opah sunfish sea catfish weever.” Rock bass sillago zebra turkeyfish , spotted danio, “shiner ronquil, deepwater cardinalfish three spot gourami, saber-toothed blenny.” New Zealand sand diver, king of herring ricefish Hammerjaw, elephant fish gombessa false cat shark? Butterfly ray bonefish damselfish, bullhead shark mummichog South American Lungfish, Ratfish snubnose parasitic eel.

\n", 355 | "excerpt": "

Pollock rivuline hammerhead shark, clingfish, ghoul flashlight fish river loach; anglerfish sailbearer emperor angelfish; longjaw mudsucker. Zander Devario cod; angelfish conger eel blue eye cutthroat trout Australian lungfish dragon goby upside-down catfish channel catfish roundhead ground shark false moray. Porgy mudsucker, tompot blenny; sheatfish pirarucu sandbar shark hairtail fierasfer Blenny oarfish, poacher houndshark, “deepwater cardinalfish […]

\n", 356 | "slug": "nine", 357 | "guid": "http://wtmpeachtest.wordpress.com/?p=27", 358 | "status": "publish", 359 | "sticky": false, 360 | "password": "", 361 | "parent": false, 362 | "type": "post", 363 | "comments_open": true, 364 | "pings_open": true, 365 | "likes_enabled": true, 366 | "sharing_enabled": true, 367 | "comment_count": 0, 368 | "like_count": 0, 369 | "i_like": false, 370 | "is_reblogged": false, 371 | "is_following": false, 372 | "global_ID": "32021d02f473cb54727b05b8127bcccd", 373 | "featured_image": "", 374 | "post_thumbnail": null, 375 | "format": "standard", 376 | "geo": false, 377 | "menu_order": 0, 378 | "publicize_URLs": [ 379 | 380 | ], 381 | "tags": { 382 | }, 383 | "categories": { 384 | "hobo": { 385 | "ID": 330835, 386 | "name": "hobo", 387 | "slug": "hobo", 388 | "description": "hobo category", 389 | "post_count": 5, 390 | "feed_url": "https://wtmpeachtest.wordpress.com/category/hobo/feed/", 391 | "parent": 0, 392 | "meta": { 393 | "links": { 394 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:hobo", 395 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:hobo/help", 396 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079" 397 | } 398 | } 399 | } 400 | }, 401 | "attachments": { 402 | }, 403 | "metadata": false, 404 | "meta": { 405 | "links": { 406 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/27", 407 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/27/help", 408 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079", 409 | "replies": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/27/replies/", 410 | "likes": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/27/likes/" 411 | } 412 | }, 413 | "current_user_can": { 414 | "publish_post": false, 415 | "delete_post": false, 416 | "edit_post": false 417 | }, 418 | "capabilities": { 419 | "publish_post": false, 420 | "delete_post": false, 421 | "edit_post": false 422 | } 423 | }, 424 | { 425 | "ID": 25, 426 | "site_ID": 39449079, 427 | "author": { 428 | "ID": 38890122, 429 | "login": "wtmpeachtest", 430 | "email": false, 431 | "name": "wtmpeachtest", 432 | "first_name": "", 433 | "last_name": "", 434 | "nice_name": "wtmpeachtest", 435 | "URL": "http://wtmpeachtest.wordpress.com", 436 | "avatar_URL": "https://1.gravatar.com/avatar/d26a62ad77067c05bf30794ddb65768e?s=96&d=identicon&r=G", 437 | "profile_URL": "https://en.gravatar.com/wtmpeachtest", 438 | "ip_address": false, 439 | "site_ID": 39449079, 440 | "site_visible": true 441 | }, 442 | "date": "2012-09-05T00:23:24+00:00", 443 | "modified": "2012-09-05T00:23:24+00:00", 444 | "title": "eight", 445 | "URL": "https://wtmpeachtest.wordpress.com/2012/09/05/eight/", 446 | "short_URL": "https://wp.me/s2Fwvt-eight", 447 | "content": "

Pickled leggings readymade iphone trust fund. Fap selvage skateboard, sartorial 3 wolf moon jean shorts blog banksy hoodie. Photo booth wolf DIY fingerstache organic twee, scenester trust fund ethnic locavore post-ironic banksy. Hella biodiesel messenger bag yr. Pinterest viral helvetica sustainable odd future, gluten-free portland kogi irony. Tumblr swag etsy direct trade, wayfarers stumptown locavore twee fingerstache portland sartorial cardigan lomo. Pop-up bespoke squid truffaut.

\n

Next level seitan post-ironic aesthetic, truffaut gastropub DIY bicycle rights leggings flexitarian readymade irony. Echo park scenester carles cardigan salvia DIY, PBR before they sold out tofu letterpress leggings cosby sweater sustainable banh mi art party. Master cleanse pop-up mcsweeney’s scenester high life whatever single-origin coffee cred, squid letterpress you probably haven’t heard of them sustainable photo booth beard. Trust fund scenester photo booth, portland lo-fi narwhal dreamcatcher squid selvage helvetica. Gastropub tumblr american apparel, viral cosby sweater aesthetic williamsburg ennui cred biodiesel pickled pour-over leggings DIY narwhal. Farm-to-table aesthetic pitchfork, gluten-free craft beer cray mcsweeney’s messenger bag next level fanny pack. Sustainable letterpress art party vice, sriracha bicycle rights Austin locavore mumblecore.

\n

Butcher next level irony fap artisan tumblr, banksy american apparel retro seitan williamsburg sriracha pitchfork marfa cardigan. Sriracha cred aesthetic, wayfarers freegan butcher echo park terry richardson cliche marfa. 3 wolf moon semiotics squid vice, small batch portland master cleanse carles cred street art narwhal fanny pack polaroid shoreditch. Carles quinoa bespoke, williamsburg gastropub pork belly seitan artisan beard VHS retro next level. Four loko vice 8-bit brooklyn tofu, ethnic brunch keytar pickled organic jean shorts. VHS yr fap truffaut, kale chips carles readymade wolf beard polaroid vinyl. American apparel mustache semiotics twee, echo park letterpress four loko vinyl bicycle rights squid lo-fi lomo umami kale chips.

\n

Mlkshk high life pork belly, gastropub terry richardson synth polaroid. Readymade bicycle rights leggings, cardigan freegan locavore tattooed cray ennui fixie etsy forage cred salvia swag. Salvia marfa williamsburg, fixie brooklyn pop-up trust fund mcsweeney’s viral skateboard street art art party ennui locavore. Bicycle rights Austin DIY, 3 wolf moon helvetica locavore gluten-free street art mlkshk bespoke. Pitchfork locavore carles banh mi polaroid mcsweeney’s, VHS lomo fap pop-up stumptown four loko. Ennui occupy twee, whatever salvia PBR 3 wolf moon kale chips fingerstache chambray. Gastropub banksy kale chips chambray swag cred.

\n", 448 | "excerpt": "

Pickled leggings readymade iphone trust fund. Fap selvage skateboard, sartorial 3 wolf moon jean shorts blog banksy hoodie. Photo booth wolf DIY fingerstache organic twee, scenester trust fund ethnic locavore post-ironic banksy. Hella biodiesel messenger bag yr. Pinterest viral helvetica sustainable odd future, gluten-free portland kogi irony. Tumblr swag etsy direct trade, wayfarers stumptown locavore […]

\n", 449 | "slug": "eight", 450 | "guid": "http://wtmpeachtest.wordpress.com/?p=25", 451 | "status": "publish", 452 | "sticky": false, 453 | "password": "", 454 | "parent": false, 455 | "type": "post", 456 | "comments_open": true, 457 | "pings_open": true, 458 | "likes_enabled": true, 459 | "sharing_enabled": true, 460 | "comment_count": 0, 461 | "like_count": 0, 462 | "i_like": false, 463 | "is_reblogged": false, 464 | "is_following": false, 465 | "global_ID": "7eff99a84e6005548dfb0c973f1bb8a8", 466 | "featured_image": "", 467 | "post_thumbnail": null, 468 | "format": "standard", 469 | "geo": false, 470 | "menu_order": 0, 471 | "publicize_URLs": [ 472 | 473 | ], 474 | "tags": { 475 | }, 476 | "categories": { 477 | "goatchild": { 478 | "ID": 110114553, 479 | "name": "goatchild", 480 | "slug": "goatchild", 481 | "description": "child of goat category", 482 | "post_count": 5, 483 | "feed_url": "https://wtmpeachtest.wordpress.com/category/goat/goatchild/feed/", 484 | "parent": 236920, 485 | "meta": { 486 | "links": { 487 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goatchild", 488 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goatchild/help", 489 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079" 490 | } 491 | } 492 | } 493 | }, 494 | "attachments": { 495 | }, 496 | "metadata": false, 497 | "meta": { 498 | "links": { 499 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/25", 500 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/25/help", 501 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079", 502 | "replies": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/25/replies/", 503 | "likes": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/25/likes/" 504 | } 505 | }, 506 | "current_user_can": { 507 | "publish_post": false, 508 | "delete_post": false, 509 | "edit_post": false 510 | }, 511 | "capabilities": { 512 | "publish_post": false, 513 | "delete_post": false, 514 | "edit_post": false 515 | } 516 | }, 517 | { 518 | "ID": 23, 519 | "site_ID": 39449079, 520 | "author": { 521 | "ID": 38890122, 522 | "login": "wtmpeachtest", 523 | "email": false, 524 | "name": "wtmpeachtest", 525 | "first_name": "", 526 | "last_name": "", 527 | "nice_name": "wtmpeachtest", 528 | "URL": "http://wtmpeachtest.wordpress.com", 529 | "avatar_URL": "https://1.gravatar.com/avatar/d26a62ad77067c05bf30794ddb65768e?s=96&d=identicon&r=G", 530 | "profile_URL": "https://en.gravatar.com/wtmpeachtest", 531 | "ip_address": false, 532 | "site_ID": 39449079, 533 | "site_visible": true 534 | }, 535 | "date": "2012-09-05T00:22:43+00:00", 536 | "modified": "2012-09-05T00:22:43+00:00", 537 | "title": "seven", 538 | "URL": "https://wtmpeachtest.wordpress.com/2012/09/05/seven/", 539 | "short_URL": "https://wp.me/s2Fwvt-seven", 540 | "content": "

Lorizzle ipsizzle dolor doggy, consectetuer shizzlin dizzle elit. Nullizzle sapien velit, aliquet volutpizzle, suscipit quis, gravida vizzle, i saw beyonces tizzles and my pizzle went crizzle. Pellentesque dizzle tortizzle. Sizzle shit. Fo izzle dolizzle dapibus turpis tempizzle gangster. Sure shit nibh izzle turpis. My shizz izzle tortizzle. Break it down own yo’ rhoncizzle nisi. In dawg habitasse for sure dictumst. Dang dapibizzle. Shizznit tellus izzle, pretium dawg, mattizzle izzle, eleifend vitae, nunc. Shiz suscipizzle. Integer semper velit yippiyo mah nizzle.

\n

Sizzle boom shackalack brizzle, luctus izzle, get down get down izzle, sollicitudizzle at, fizzle. Bow wow wow cool, nisi egestas shizzlin dizzle malesuada, neque stuff consequat velit, mollizzle fringilla libero dang izzle purus. Class cool black dizzle izzle litora get down get down per conubia nostra, pizzle you son of a bizzle stuff. Dizzle mauris dang, scelerisque bling bling, iaculizzle vel, accumsizzle we gonna chung, break yo neck, yall. Go to hizzle lacus. That’s the shizzle izzle shiznit, accumsizzle shizzlin dizzle, feugizzle nec, dope crazy, sapizzle. Curabitur that’s the shizzle. Break yo neck, yall non fizzle nizzle mammasay mammasa mamma oo sa sheezy fo shizzle mah nizzle fo rizzle, mah home g-dizzle. Integizzle check out this felizzle, dang, elementum quizzle, shiz nizzle, ligula. Maecenizzle nizzle pede. Dizzle nibh. Fo dawg. Check it out sizzle. Maecenas metizzle magna, sempizzle crackalackin, lobortizzle sizzle, molestie ass, lacus. Fo shizzle hizzle nibh, sempizzle dang, dapibizzle gizzle, pretizzle dope, velizzle. Fo shizzle ass hizzle quizzle shit tempizzle we gonna chung.

\n

Sizzle crunk tortizzle check it out arcu bizzle consequat. Check it out convallizzle, fo ac dignissizzle bizzle, nulla doggy ghetto pede, yo mamma mah nizzle fizzle dolizzle funky fresh velizzle. Pellentesque izzle for sure nizzle elit varius tincidunt. Pizzle shiznit nisi, fizzle izzle, porta you son of a bizzle, tincidunt izzle, i’m in the shizzle. Nunc sizzle shiznit. Lorizzle ipsizzle dolor sizzle phat, fo shizzle phat elit. Bizzle izzle go to hizzle. In congue. Vestibulum boom shackalack erizzle tellivizzle velit dang phat. My shizz facilisizzle shizznit sit amet nibh. Funky fresh commodo. Nunc eu ante izzle mah nizzle lacinia sagittis. Aenean crazy massa pizzle urna pharetra lobortizzle. Suspendisse enizzle dawg, bibendum pulvinar, ornare vel, dope, lacizzle. Vivamus eget nizzle izzle black adipiscing tempor. Sizzle fizzle nisl quis tellizzle ornare nonummy.

\n

Nulla facilisi. We gonna chung faucibizzle pharetra sizzle. Phat its fo rizzle the bizzle izzle yo. Cras boofron odio ma nizzle ipsizzle. Pizzle izzle vizzle . Crizzle laoreet, mi away eleifend sheezy, dolizzle fo shizzle bibendizzle sizzle, eu placerat quizzle black egizzle funky fresh. Etizzle adipiscing, lectizzle gizzle doggy yo, fo boofron yo orci, fo shizzle my nizzle sagittis nulla mi phat. Suspendisse get down get down mattizzle pede. In pulvinar aliquizzle my shizz. Praesent dang enim, bizzle yippiyo, facilisis nec, get down get down izzle, hizzle. Shit eget massa crazy ma nizzle blandit dictum. Dawg ullamcorpizzle turpis izzle dang tincidunt fo shizzle my nizzle. Fo shizzle mah nizzle fo rizzle, mah home g-dizzle own yo’ maurizzle. Maecenas fo shizzle. Vivamus fermentizzle brizzle daahng dawg. Pellentesque mi. Boom shackalack ipsizzle sizzle we gonna chung amet, consectetizzle adipiscing elizzle. Hizzle that’s the shizzle arcu, convallizzle fo shizzle, sagittis a, pharetra own yo’, bow wow wow. Lorizzle you son of a bizzle things sizzle rizzle, consectetizzle fo shizzle my nizzle fizzle.

\n", 541 | "excerpt": "

Lorizzle ipsizzle dolor doggy, consectetuer shizzlin dizzle elit. Nullizzle sapien velit, aliquet volutpizzle, suscipit quis, gravida vizzle, i saw beyonces tizzles and my pizzle went crizzle. Pellentesque dizzle tortizzle. Sizzle shit. Fo izzle dolizzle dapibus turpis tempizzle gangster. Sure shit nibh izzle turpis. My shizz izzle tortizzle. Break it down own yo’ rhoncizzle nisi. In […]

\n", 542 | "slug": "seven", 543 | "guid": "http://wtmpeachtest.wordpress.com/?p=23", 544 | "status": "publish", 545 | "sticky": false, 546 | "password": "", 547 | "parent": false, 548 | "type": "post", 549 | "comments_open": true, 550 | "pings_open": true, 551 | "likes_enabled": true, 552 | "sharing_enabled": true, 553 | "comment_count": 0, 554 | "like_count": 0, 555 | "i_like": false, 556 | "is_reblogged": false, 557 | "is_following": false, 558 | "global_ID": "8ffe155861320d5631cd67a46b9b9aad", 559 | "featured_image": "", 560 | "post_thumbnail": null, 561 | "format": "standard", 562 | "geo": false, 563 | "menu_order": 0, 564 | "publicize_URLs": [ 565 | 566 | ], 567 | "tags": { 568 | }, 569 | "categories": { 570 | "goat": { 571 | "ID": 236920, 572 | "name": "goat", 573 | "slug": "goat", 574 | "description": "goat category", 575 | "post_count": 6, 576 | "feed_url": "https://wtmpeachtest.wordpress.com/category/goat/feed/", 577 | "parent": 0, 578 | "meta": { 579 | "links": { 580 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goat", 581 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goat/help", 582 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079" 583 | } 584 | } 585 | } 586 | }, 587 | "attachments": { 588 | }, 589 | "metadata": false, 590 | "meta": { 591 | "links": { 592 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/23", 593 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/23/help", 594 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079", 595 | "replies": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/23/replies/", 596 | "likes": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/23/likes/" 597 | } 598 | }, 599 | "current_user_can": { 600 | "publish_post": false, 601 | "delete_post": false, 602 | "edit_post": false 603 | }, 604 | "capabilities": { 605 | "publish_post": false, 606 | "delete_post": false, 607 | "edit_post": false 608 | } 609 | }, 610 | { 611 | "ID": 20, 612 | "site_ID": 39449079, 613 | "author": { 614 | "ID": 38890122, 615 | "login": "wtmpeachtest", 616 | "email": false, 617 | "name": "wtmpeachtest", 618 | "first_name": "", 619 | "last_name": "", 620 | "nice_name": "wtmpeachtest", 621 | "URL": "http://wtmpeachtest.wordpress.com", 622 | "avatar_URL": "https://1.gravatar.com/avatar/d26a62ad77067c05bf30794ddb65768e?s=96&d=identicon&r=G", 623 | "profile_URL": "https://en.gravatar.com/wtmpeachtest", 624 | "ip_address": false, 625 | "site_ID": 39449079, 626 | "site_visible": true 627 | }, 628 | "date": "2012-09-05T00:22:03+00:00", 629 | "modified": "2012-09-05T00:22:03+00:00", 630 | "title": "six", 631 | "URL": "https://wtmpeachtest.wordpress.com/2012/09/05/six/", 632 | "short_URL": "https://wp.me/s2Fwvt-six", 633 | "content": "

Cupcake ipsum dolor sit amet croissant I love. Jujubes souffl� danish marshmallow liquorice cake oat cake. Sugar plum chocolate bar pie cake. Jujubes jelly beans chocolate danish chocolate cake marzipan brownie. I love chupa chups oat cake macaroon faworki applicake. Tiramisu wafer powder macaroon jelly-o. Wafer bear claw apple pie. Cookie I love chupa chups icing icing.
\nMuffin pie chocolate donut cake biscuit tart applicake halvah. Lemon drops pastry bonbon applicake jelly-o carrot cake lemon drops pudding. Faworki candy sweet cake danish. Icing carrot cake liquorice. Cookie donut oat cake muffin. Macaroon cheesecake gingerbread I love I love sweet roll powder oat cake. Sweet chupa chups I love bonbon I love jelly-o powder.
\nCandy canes I love oat cake sweet roll pudding candy chocolate bar. Tiramisu cotton candy jelly beans caramels. Lollipop candy jelly marzipan cupcake cake. Toffee applicake I love. Chocolate cake candy canes applicake sweet drag�e pie. Jelly beans tiramisu candy dessert applicake.

\n", 634 | "excerpt": "

Cupcake ipsum dolor sit amet croissant I love. Jujubes souffl� danish marshmallow liquorice cake oat cake. Sugar plum chocolate bar pie cake. Jujubes jelly beans chocolate danish chocolate cake marzipan brownie. I love chupa chups oat cake macaroon faworki applicake. Tiramisu wafer powder macaroon jelly-o. Wafer bear claw apple pie. Cookie I love chupa chups […]

\n", 635 | "slug": "six", 636 | "guid": "http://wtmpeachtest.wordpress.com/?p=20", 637 | "status": "publish", 638 | "sticky": false, 639 | "password": "", 640 | "parent": false, 641 | "type": "post", 642 | "comments_open": true, 643 | "pings_open": true, 644 | "likes_enabled": true, 645 | "sharing_enabled": true, 646 | "comment_count": 0, 647 | "like_count": 0, 648 | "i_like": false, 649 | "is_reblogged": false, 650 | "is_following": false, 651 | "global_ID": "50a86d297549b98718b365e7db3299c5", 652 | "featured_image": "", 653 | "post_thumbnail": null, 654 | "format": "standard", 655 | "geo": false, 656 | "menu_order": 0, 657 | "publicize_URLs": [ 658 | 659 | ], 660 | "tags": { 661 | }, 662 | "categories": { 663 | "Uncategorized": { 664 | "ID": 1, 665 | "name": "Uncategorized", 666 | "slug": "uncategorized", 667 | "description": "", 668 | "post_count": 1, 669 | "feed_url": "https://wtmpeachtest.wordpress.com/category/uncategorized/feed/", 670 | "parent": 0, 671 | "meta": { 672 | "links": { 673 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:uncategorized", 674 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:uncategorized/help", 675 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079" 676 | } 677 | } 678 | } 679 | }, 680 | "attachments": { 681 | }, 682 | "metadata": false, 683 | "meta": { 684 | "links": { 685 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/20", 686 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/20/help", 687 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079", 688 | "replies": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/20/replies/", 689 | "likes": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/20/likes/" 690 | } 691 | }, 692 | "current_user_can": { 693 | "publish_post": false, 694 | "delete_post": false, 695 | "edit_post": false 696 | }, 697 | "capabilities": { 698 | "publish_post": false, 699 | "delete_post": false, 700 | "edit_post": false 701 | } 702 | }, 703 | { 704 | "ID": 18, 705 | "site_ID": 39449079, 706 | "author": { 707 | "ID": 38890122, 708 | "login": "wtmpeachtest", 709 | "email": false, 710 | "name": "wtmpeachtest", 711 | "first_name": "", 712 | "last_name": "", 713 | "nice_name": "wtmpeachtest", 714 | "URL": "http://wtmpeachtest.wordpress.com", 715 | "avatar_URL": "https://1.gravatar.com/avatar/d26a62ad77067c05bf30794ddb65768e?s=96&d=identicon&r=G", 716 | "profile_URL": "https://en.gravatar.com/wtmpeachtest", 717 | "ip_address": false, 718 | "site_ID": 39449079, 719 | "site_visible": true 720 | }, 721 | "date": "2012-09-05T00:15:47+00:00", 722 | "modified": "2012-09-05T00:15:47+00:00", 723 | "title": "Five", 724 | "URL": "https://wtmpeachtest.wordpress.com/2012/09/05/five/", 725 | "short_URL": "https://wp.me/s2Fwvt-five", 726 | "content": "

Lorem ipsum dolor sit amet suscipit; ad maecenas fermentum sit per dictum id adipiscing ante� vivamush tortor uultrices� donec ut vulputate fames etughm ut� egestas torquent. Lorem� porta fauucibus taciti class, maecenash, justo lorem uut commodo tincidunt. Id viverra, est dughm tincidunt accuumshan curabitur aliquam conshectetur� primish; turpis nunc vitae ipsuum, “platea ante aptent ultrices.” Feuugiat; vivamush etiam aliquam ante. WOOOOOOOOO! Platea et dictum laoreet velit nishl tincidunt tortor� porttitor; etiam ultriciesh. Lacinia pellentesque sit porttitor ipshum; quam tempus ad nullam, nam� rhoncuush adipiscing. Sagittis netus inceptosh ut eget shcelerisque, “sed, crash elit purus hendrerit nibh netush pharetra maecenas,” condimentum. Hold my beer.

\n

Libero� aliquet interduum sagittis odio aliquet cras per. Lectus leo varius, fermentuum felish sollicitudin. Quishque aliquam moleshtie amet velit torquent primish diam� orci metush. Guys� I think I’m fallin’ for her. Cubilia esht quuisque interdum� fermentuum eleifend pharetra imperdiet mi dolor quisque rutrum conshectetur tempor, vulputate, bibendum congue esht eget hendrerit curabitur leo. I fuggin’ love this guy. Nullam famesh, lorem a suuscipit integer nuunc potenti. Duish odio, potenti lorem condimentum congue.

\n

Morbi mollis cuurae; sed nisi erosh ut enim nec lobortis vehicuula faucibus consectetur sed litora juushto. Per; augue curabitur adipishcing egestas fusce quishque clashs dui, odio sit nisl nec� ad. Inceptos auctor conshectetuur uultriciesh quis esht aliquam aenean aliquam curshus quuam tempus tristique, mollis mi feugiat telluus dolor vulputate. Pulvinar aptent; imperdiet shemper pulvinar consectetur curae, eu tempor� fushce libero viverra, torquent id quisque. Class aliquet vivamus famesh amet eleifend quisque a feugiat famesh puurus ut, “ornare jushto auctor purush ultrices?”

\n", 727 | "excerpt": "

Lorem ipsum dolor sit amet suscipit; ad maecenas fermentum sit per dictum id adipiscing ante� vivamush tortor uultrices� donec ut vulputate fames etughm ut� egestas torquent. Lorem� porta fauucibus taciti class, maecenash, justo lorem uut commodo tincidunt. Id viverra, est dughm tincidunt accuumshan curabitur aliquam conshectetur� primish; turpis nunc vitae ipsuum, “platea ante aptent ultrices.” […]

\n", 728 | "slug": "five", 729 | "guid": "http://wtmpeachtest.wordpress.com/?p=18", 730 | "status": "publish", 731 | "sticky": false, 732 | "password": "", 733 | "parent": false, 734 | "type": "post", 735 | "comments_open": true, 736 | "pings_open": true, 737 | "likes_enabled": true, 738 | "sharing_enabled": true, 739 | "comment_count": 0, 740 | "like_count": 0, 741 | "i_like": false, 742 | "is_reblogged": false, 743 | "is_following": false, 744 | "global_ID": "eecc8fd8bbd5d7ce78d26764ac480cee", 745 | "featured_image": "", 746 | "post_thumbnail": null, 747 | "format": "standard", 748 | "geo": false, 749 | "menu_order": 0, 750 | "publicize_URLs": [ 751 | 752 | ], 753 | "tags": { 754 | }, 755 | "categories": { 756 | "goatchild": { 757 | "ID": 110114553, 758 | "name": "goatchild", 759 | "slug": "goatchild", 760 | "description": "child of goat category", 761 | "post_count": 5, 762 | "feed_url": "https://wtmpeachtest.wordpress.com/category/goat/goatchild/feed/", 763 | "parent": 236920, 764 | "meta": { 765 | "links": { 766 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goatchild", 767 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goatchild/help", 768 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079" 769 | } 770 | } 771 | }, 772 | "hobo": { 773 | "ID": 330835, 774 | "name": "hobo", 775 | "slug": "hobo", 776 | "description": "hobo category", 777 | "post_count": 5, 778 | "feed_url": "https://wtmpeachtest.wordpress.com/category/hobo/feed/", 779 | "parent": 0, 780 | "meta": { 781 | "links": { 782 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:hobo", 783 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:hobo/help", 784 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079" 785 | } 786 | } 787 | } 788 | }, 789 | "attachments": { 790 | }, 791 | "metadata": false, 792 | "meta": { 793 | "links": { 794 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/18", 795 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/18/help", 796 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079", 797 | "replies": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/18/replies/", 798 | "likes": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/18/likes/" 799 | } 800 | }, 801 | "current_user_can": { 802 | "publish_post": false, 803 | "delete_post": false, 804 | "edit_post": false 805 | }, 806 | "capabilities": { 807 | "publish_post": false, 808 | "delete_post": false, 809 | "edit_post": false 810 | } 811 | }, 812 | { 813 | "ID": 16, 814 | "site_ID": 39449079, 815 | "author": { 816 | "ID": 38890122, 817 | "login": "wtmpeachtest", 818 | "email": false, 819 | "name": "wtmpeachtest", 820 | "first_name": "", 821 | "last_name": "", 822 | "nice_name": "wtmpeachtest", 823 | "URL": "http://wtmpeachtest.wordpress.com", 824 | "avatar_URL": "https://1.gravatar.com/avatar/d26a62ad77067c05bf30794ddb65768e?s=96&d=identicon&r=G", 825 | "profile_URL": "https://en.gravatar.com/wtmpeachtest", 826 | "ip_address": false, 827 | "site_ID": 39449079, 828 | "site_visible": true 829 | }, 830 | "date": "2012-09-05T00:14:49+00:00", 831 | "modified": "2012-09-05T00:14:49+00:00", 832 | "title": "four", 833 | "URL": "https://wtmpeachtest.wordpress.com/2012/09/05/four/", 834 | "short_URL": "https://wp.me/s2Fwvt-four", 835 | "content": "

Bacon ipsum dolor sit amet hamburger chicken frankfurter ham hock, flank meatball salami strip steak. Sausage chicken ground round leberkas meatball. Pancetta drumstick meatloaf, venison shoulder tongue spare ribs boudin jowl pastrami meatball shank tenderloin salami beef. Meatball ham shankle short ribs andouille drumstick. Short loin sausage pancetta, hamburger meatloaf bacon sirloin pork kielbasa beef filet mignon shoulder.

\n

Leberkas meatloaf shoulder, corned beef jowl shank pig ribeye capicola. Chuck prosciutto ground round spare ribs venison, sausage turkey jowl strip steak boudin corned beef shankle. Short ribs tongue kielbasa sirloin, strip steak bresaola spare ribs. Flank corned beef turducken pastrami short ribs sausage salami drumstick. Corned beef boudin pig turducken.

\n

Flank sirloin tail shank, prosciutto rump jerky strip steak shankle ball tip pork chop shoulder t-bone. Beef ribs kielbasa filet mignon, leberkas spare ribs turkey sausage short ribs t-bone. Meatloaf meatball tail pancetta pig, shank swine ham hock spare ribs bresaola ham. Capicola biltong shankle, pork chop brisket swine meatball spare ribs. Meatball pork chop jerky shank turkey tongue ham hock ground round. Ham hock tenderloin bresaola capicola.

\n", 836 | "excerpt": "

Bacon ipsum dolor sit amet hamburger chicken frankfurter ham hock, flank meatball salami strip steak. Sausage chicken ground round leberkas meatball. Pancetta drumstick meatloaf, venison shoulder tongue spare ribs boudin jowl pastrami meatball shank tenderloin salami beef. Meatball ham shankle short ribs andouille drumstick. Short loin sausage pancetta, hamburger meatloaf bacon sirloin pork kielbasa beef […]

\n", 837 | "slug": "four", 838 | "guid": "http://wtmpeachtest.wordpress.com/?p=16", 839 | "status": "publish", 840 | "sticky": false, 841 | "password": "", 842 | "parent": false, 843 | "type": "post", 844 | "comments_open": true, 845 | "pings_open": true, 846 | "likes_enabled": true, 847 | "sharing_enabled": true, 848 | "comment_count": 0, 849 | "like_count": 0, 850 | "i_like": false, 851 | "is_reblogged": false, 852 | "is_following": false, 853 | "global_ID": "bf8c8b18e1362eab8b451b2079fca8c6", 854 | "featured_image": "", 855 | "post_thumbnail": null, 856 | "format": "standard", 857 | "geo": false, 858 | "menu_order": 0, 859 | "publicize_URLs": [ 860 | 861 | ], 862 | "tags": { 863 | }, 864 | "categories": { 865 | "goat": { 866 | "ID": 236920, 867 | "name": "goat", 868 | "slug": "goat", 869 | "description": "goat category", 870 | "post_count": 6, 871 | "feed_url": "https://wtmpeachtest.wordpress.com/category/goat/feed/", 872 | "parent": 0, 873 | "meta": { 874 | "links": { 875 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goat", 876 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goat/help", 877 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079" 878 | } 879 | } 880 | } 881 | }, 882 | "attachments": { 883 | }, 884 | "metadata": false, 885 | "meta": { 886 | "links": { 887 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/16", 888 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/16/help", 889 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079", 890 | "replies": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/16/replies/", 891 | "likes": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/16/likes/" 892 | } 893 | }, 894 | "current_user_can": { 895 | "publish_post": false, 896 | "delete_post": false, 897 | "edit_post": false 898 | }, 899 | "capabilities": { 900 | "publish_post": false, 901 | "delete_post": false, 902 | "edit_post": false 903 | } 904 | }, 905 | { 906 | "ID": 6, 907 | "site_ID": 39449079, 908 | "author": { 909 | "ID": 38890122, 910 | "login": "wtmpeachtest", 911 | "email": false, 912 | "name": "wtmpeachtest", 913 | "first_name": "", 914 | "last_name": "", 915 | "nice_name": "wtmpeachtest", 916 | "URL": "http://wtmpeachtest.wordpress.com", 917 | "avatar_URL": "https://1.gravatar.com/avatar/d26a62ad77067c05bf30794ddb65768e?s=96&d=identicon&r=G", 918 | "profile_URL": "https://en.gravatar.com/wtmpeachtest", 919 | "ip_address": false, 920 | "site_ID": 39449079, 921 | "site_visible": true 922 | }, 923 | "date": "2012-08-17T01:21:29+00:00", 924 | "modified": "2012-09-04T19:24:11+00:00", 925 | "title": "Another Post", 926 | "URL": "https://wtmpeachtest.wordpress.com/2012/08/17/another-post/", 927 | "short_URL": "https://wp.me/p2Fwvt-6", 928 | "content": "

hard cider trappist brew kettle, draft (draught), autolysis. attenuation, ” lagering hoppy berliner weisse pilsner lager.” bottle conditioning, ” lauter tun filter dry hopping heat exchanger.” beer hydrometer squares, malt extract malt; barleywine. tulip glass pitching adjunct. draft (draught) squares saccharification adjunct; hop back top-fermenting yeast, caramel malt bottle conditioning.

\n

cask abv alpha acid beer anaerobic cask lauter heat exchanger, brew kettle, microbrewery. abv sparge craft beer grainy abbey autolysis beer hop back. wort chiller dextrin bung, lauter tun craft beer degrees plato bock squares. racking, pitching grainy reinheitsgebot pitch bunghole.

\n

cask conditioned ale hydrometer bittering hops chocolate malt. real ale attenuation! mouthfeel trappist, ” kolsch alpha acid; wort mash tun!” berliner weisse oxidized, sparge pitch primary fermentation ester hydrometer barrel saccharification: krug. sparge gravity microbrewery enzymes barrel ale reinheitsgebot? yeast pitching cask conditioned ale, cask conditioned ale pub hops goblet. pint glass; lager additive amber, ester keg, ipa lagering.

\n

hard cider trappist brew kettle, draft (draught), autolysis. attenuation, ” lagering hoppy berliner weisse pilsner lager.” bottle conditioning, ” lauter tun filter dry hopping heat exchanger.” beer hydrometer squares, malt extract malt; barleywine. tulip glass pitching adjunct. draft (draught) squares saccharification adjunct; hop back top-fermenting yeast, caramel malt bottle conditioning.

\n

cask abv alpha acid beer anaerobic cask lauter heat exchanger, brew kettle, microbrewery. abv sparge craft beer grainy abbey autolysis beer hop back. wort chiller dextrin bung, lauter tun craft beer degrees plato bock squares. racking, pitching grainy reinheitsgebot pitch bunghole.

\n

cask conditioned ale hydrometer bittering hops chocolate malt. real ale attenuation! mouthfeel trappist, ” kolsch alpha acid; wort mash tun!” berliner weisse oxidized, sparge pitch primary fermentation ester hydrometer barrel saccharification: krug. sparge gravity microbrewery enzymes barrel ale reinheitsgebot? yeast pitching cask conditioned ale, cask conditioned ale pub hops goblet. pint glass; lager additive amber, ester keg, ipa lagering.

\n", 929 | "excerpt": "

hard cider trappist brew kettle, draft (draught), autolysis. attenuation, ” lagering hoppy berliner weisse pilsner lager.” bottle conditioning, ” lauter tun filter dry hopping heat exchanger.” beer hydrometer squares, malt extract malt; barleywine. tulip glass pitching adjunct. draft (draught) squares saccharification adjunct; hop back top-fermenting yeast, caramel malt bottle conditioning. cask abv alpha acid beer […]

\n", 930 | "slug": "another-post", 931 | "guid": "http://wtmpeachtest.wordpress.com/?p=6", 932 | "status": "publish", 933 | "sticky": false, 934 | "password": "", 935 | "parent": false, 936 | "type": "post", 937 | "comments_open": true, 938 | "pings_open": true, 939 | "likes_enabled": true, 940 | "sharing_enabled": true, 941 | "comment_count": 0, 942 | "like_count": 0, 943 | "i_like": false, 944 | "is_reblogged": false, 945 | "is_following": false, 946 | "global_ID": "dea5140dc605b1fba6037d278d50bef7", 947 | "featured_image": "", 948 | "post_thumbnail": null, 949 | "format": "standard", 950 | "geo": false, 951 | "menu_order": 0, 952 | "publicize_URLs": [ 953 | 954 | ], 955 | "tags": { 956 | }, 957 | "categories": { 958 | "goat": { 959 | "ID": 236920, 960 | "name": "goat", 961 | "slug": "goat", 962 | "description": "goat category", 963 | "post_count": 6, 964 | "feed_url": "https://wtmpeachtest.wordpress.com/category/goat/feed/", 965 | "parent": 0, 966 | "meta": { 967 | "links": { 968 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goat", 969 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goat/help", 970 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079" 971 | } 972 | } 973 | } 974 | }, 975 | "attachments": { 976 | }, 977 | "metadata": false, 978 | "meta": { 979 | "links": { 980 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/6", 981 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/6/help", 982 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079", 983 | "replies": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/6/replies/", 984 | "likes": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/6/likes/" 985 | } 986 | }, 987 | "current_user_can": { 988 | "publish_post": false, 989 | "delete_post": false, 990 | "edit_post": false 991 | }, 992 | "capabilities": { 993 | "publish_post": false, 994 | "delete_post": false, 995 | "edit_post": false 996 | } 997 | }, 998 | { 999 | "ID": 3, 1000 | "site_ID": 39449079, 1001 | "author": { 1002 | "ID": 38890122, 1003 | "login": "wtmpeachtest", 1004 | "email": false, 1005 | "name": "wtmpeachtest", 1006 | "first_name": "", 1007 | "last_name": "", 1008 | "nice_name": "wtmpeachtest", 1009 | "URL": "http://wtmpeachtest.wordpress.com", 1010 | "avatar_URL": "https://1.gravatar.com/avatar/d26a62ad77067c05bf30794ddb65768e?s=96&d=identicon&r=G", 1011 | "profile_URL": "https://en.gravatar.com/wtmpeachtest", 1012 | "ip_address": false, 1013 | "site_ID": 39449079, 1014 | "site_visible": true 1015 | }, 1016 | "date": "2012-08-17T00:40:43+00:00", 1017 | "modified": "2012-09-04T19:28:31+00:00", 1018 | "title": "Test Post One", 1019 | "URL": "https://wtmpeachtest.wordpress.com/2012/08/17/test-post-one/", 1020 | "short_URL": "https://wp.me/p2Fwvt-3", 1021 | "content": "

hard cider trappist brew kettle, draft (draught), autolysis. attenuation, ” lagering hoppy berliner weisse pilsner lager.” bottle conditioning, ” lauter tun filter dry hopping heat exchanger.” beer hydrometer squares, malt extract malt; barleywine. tulip glass pitching adjunct. draft (draught) squares saccharification adjunct; hop back top-fermenting yeast, caramel malt bottle conditioning.

\n

cask abv alpha acid beer anaerobic cask lauter heat exchanger, brew kettle, microbrewery. abv sparge craft beer grainy abbey autolysis beer hop back. wort chiller dextrin bung, lauter tun craft beer degrees plato bock squares. racking, pitching grainy reinheitsgebot pitch bunghole.

\n

cask conditioned ale hydrometer bittering hops chocolate malt. real ale attenuation! mouthfeel trappist, ” kolsch alpha acid; wort mash tun!” berliner weisse oxidized, sparge pitch primary fermentation ester hydrometer barrel saccharification: krug. sparge gravity microbrewery enzymes barrel ale reinheitsgebot? yeast pitching cask conditioned ale, cask conditioned ale pub hops goblet. pint glass; lager additive amber, ester keg, ipa lagering.

\n", 1022 | "excerpt": "

hard cider trappist brew kettle, draft (draught), autolysis. attenuation, ” lagering hoppy berliner weisse pilsner lager.” bottle conditioning, ” lauter tun filter dry hopping heat exchanger.” beer hydrometer squares, malt extract malt; barleywine. tulip glass pitching adjunct. draft (draught) squares saccharification adjunct; hop back top-fermenting yeast, caramel malt bottle conditioning. cask abv alpha acid beer […]

\n", 1023 | "slug": "test-post-one", 1024 | "guid": "http://wtmpeachtest.wordpress.com/2012/08/17/test-post-one/", 1025 | "status": "publish", 1026 | "sticky": false, 1027 | "password": "", 1028 | "parent": false, 1029 | "type": "post", 1030 | "comments_open": true, 1031 | "pings_open": true, 1032 | "likes_enabled": true, 1033 | "sharing_enabled": true, 1034 | "comment_count": 0, 1035 | "like_count": 0, 1036 | "i_like": false, 1037 | "is_reblogged": false, 1038 | "is_following": false, 1039 | "global_ID": "2ae3d0378c529e1c9e7ebefa3d9f5385", 1040 | "featured_image": "", 1041 | "post_thumbnail": null, 1042 | "format": "standard", 1043 | "geo": false, 1044 | "menu_order": 0, 1045 | "publicize_URLs": [ 1046 | 1047 | ], 1048 | "tags": { 1049 | }, 1050 | "categories": { 1051 | "goatchild": { 1052 | "ID": 110114553, 1053 | "name": "goatchild", 1054 | "slug": "goatchild", 1055 | "description": "child of goat category", 1056 | "post_count": 5, 1057 | "feed_url": "https://wtmpeachtest.wordpress.com/category/goat/goatchild/feed/", 1058 | "parent": 236920, 1059 | "meta": { 1060 | "links": { 1061 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goatchild", 1062 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:goatchild/help", 1063 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079" 1064 | } 1065 | } 1066 | }, 1067 | "hobo": { 1068 | "ID": 330835, 1069 | "name": "hobo", 1070 | "slug": "hobo", 1071 | "description": "hobo category", 1072 | "post_count": 5, 1073 | "feed_url": "https://wtmpeachtest.wordpress.com/category/hobo/feed/", 1074 | "parent": 0, 1075 | "meta": { 1076 | "links": { 1077 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:hobo", 1078 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:hobo/help", 1079 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079" 1080 | } 1081 | } 1082 | } 1083 | }, 1084 | "attachments": { 1085 | }, 1086 | "metadata": false, 1087 | "meta": { 1088 | "links": { 1089 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/3", 1090 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/3/help", 1091 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079", 1092 | "replies": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/3/replies/", 1093 | "likes": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/3/likes/" 1094 | } 1095 | }, 1096 | "current_user_can": { 1097 | "publish_post": false, 1098 | "delete_post": false, 1099 | "edit_post": false 1100 | }, 1101 | "capabilities": { 1102 | "publish_post": false, 1103 | "delete_post": false, 1104 | "edit_post": false 1105 | } 1106 | }, 1107 | { 1108 | "ID": 1, 1109 | "site_ID": 39449079, 1110 | "author": { 1111 | "ID": 38890122, 1112 | "login": "wtmpeachtest", 1113 | "email": false, 1114 | "name": "wtmpeachtest", 1115 | "first_name": "", 1116 | "last_name": "", 1117 | "nice_name": "wtmpeachtest", 1118 | "URL": "http://wtmpeachtest.wordpress.com", 1119 | "avatar_URL": "https://1.gravatar.com/avatar/d26a62ad77067c05bf30794ddb65768e?s=96&d=identicon&r=G", 1120 | "profile_URL": "https://en.gravatar.com/wtmpeachtest", 1121 | "ip_address": false, 1122 | "site_ID": 39449079, 1123 | "site_visible": true 1124 | }, 1125 | "date": "2012-08-17T00:37:35+00:00", 1126 | "modified": "2012-09-04T19:24:24+00:00", 1127 | "title": "Hello world!", 1128 | "URL": "https://wtmpeachtest.wordpress.com/2012/08/17/hello-world/", 1129 | "short_URL": "https://wp.me/p2Fwvt-1", 1130 | "content": "

Welcome to WordPress.com! This is your very first post. Click the Edit link to modify or delete it, or start a new post. If you like, use this post to tell readers why you started this blog and what you plan to do with it.

\n

Happy blogging!

\n", 1131 | "excerpt": "

Welcome to WordPress.com! This is your very first post. Click the Edit link to modify or delete it, or start a new post. If you like, use this post to tell readers why you started this blog and what you plan to do with it. Happy blogging!

\n", 1132 | "slug": "hello-world", 1133 | "guid": "http://wtmpeachtest.wordpress.com/?p=1", 1134 | "status": "publish", 1135 | "sticky": false, 1136 | "password": "", 1137 | "parent": false, 1138 | "type": "post", 1139 | "comments_open": true, 1140 | "pings_open": true, 1141 | "likes_enabled": true, 1142 | "sharing_enabled": true, 1143 | "comment_count": 1, 1144 | "like_count": 0, 1145 | "i_like": false, 1146 | "is_reblogged": false, 1147 | "is_following": false, 1148 | "global_ID": "4121e09f7846d10dd5d9089f9005942a", 1149 | "featured_image": "", 1150 | "post_thumbnail": null, 1151 | "format": "standard", 1152 | "geo": false, 1153 | "menu_order": 0, 1154 | "publicize_URLs": [ 1155 | 1156 | ], 1157 | "tags": { 1158 | }, 1159 | "categories": { 1160 | "hobo": { 1161 | "ID": 330835, 1162 | "name": "hobo", 1163 | "slug": "hobo", 1164 | "description": "hobo category", 1165 | "post_count": 5, 1166 | "feed_url": "https://wtmpeachtest.wordpress.com/category/hobo/feed/", 1167 | "parent": 0, 1168 | "meta": { 1169 | "links": { 1170 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:hobo", 1171 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/categories/slug:hobo/help", 1172 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079" 1173 | } 1174 | } 1175 | } 1176 | }, 1177 | "attachments": { 1178 | }, 1179 | "metadata": false, 1180 | "meta": { 1181 | "links": { 1182 | "self": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/1", 1183 | "help": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/1/help", 1184 | "site": "https://public-api.wordpress.com/rest/v1/sites/39449079", 1185 | "replies": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/1/replies/", 1186 | "likes": "https://public-api.wordpress.com/rest/v1/sites/39449079/posts/1/likes/" 1187 | } 1188 | }, 1189 | "current_user_can": { 1190 | "publish_post": false, 1191 | "delete_post": false, 1192 | "edit_post": false 1193 | }, 1194 | "capabilities": { 1195 | "publish_post": false, 1196 | "delete_post": false, 1197 | "edit_post": false 1198 | } 1199 | } 1200 | ] 1201 | } -------------------------------------------------------------------------------- /JsonFlatten.Tests/SampleJson/PathWithDotNotation.json: -------------------------------------------------------------------------------- 1 | { 2 | "outer": { 3 | "inner.path": { 4 | "another.inner.path": 123, 5 | "another.inner.path.array": [ 6 | { "numbers": [1,2,3] } 7 | ] 8 | } 9 | }, 10 | "another outer path": { 11 | "inner": { 12 | "test.with.periods": "abc", 13 | "test with spaces": 123, 14 | "test with spaces w/ null": null, 15 | "test with spaces w/ empty []": [] 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /JsonFlatten.Tests/SampleJson/Simple.json: -------------------------------------------------------------------------------- 1 | { 2 | "array": [ 3 | 1, 4 | 2, 5 | 3 6 | ], 7 | "boolean": true, 8 | "null": null, 9 | "number": 123, 10 | "object": { 11 | "a": "b", 12 | "c": "d", 13 | "e": "f" 14 | }, 15 | "date": "2014-01-01T23:28:56.782Z", 16 | "string": "Hello World", 17 | "emptyObject": {}, 18 | "emptyString": "", 19 | "emptyArray": [], 20 | "1": "numeric node", 21 | "Data": { 22 | "Data": { 23 | "Dimensions": { 24 | "-00705309": { 25 | "Width": { 26 | "Min": 123 27 | } 28 | } 29 | } 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /JsonFlatten.Tests/app.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /JsonFlatten.Tests/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /JsonFlatten.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.28803.352 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JsonFlatten", "JsonFlatten\JsonFlatten.csproj", "{C1DF78A2-ACEE-42AB-8020-0289C6E2B26C}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JsonFlatten.Tests", "JsonFlatten.Tests\JsonFlatten.Tests.csproj", "{D698B899-C670-4A4D-BAB8-1575C1974BAC}" 9 | ProjectSection(ProjectDependencies) = postProject 10 | {C1DF78A2-ACEE-42AB-8020-0289C6E2B26C} = {C1DF78A2-ACEE-42AB-8020-0289C6E2B26C} 11 | EndProjectSection 12 | EndProject 13 | Global 14 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 15 | Debug|Any CPU = Debug|Any CPU 16 | Release|Any CPU = Release|Any CPU 17 | EndGlobalSection 18 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 19 | {C1DF78A2-ACEE-42AB-8020-0289C6E2B26C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 20 | {C1DF78A2-ACEE-42AB-8020-0289C6E2B26C}.Debug|Any CPU.Build.0 = Debug|Any CPU 21 | {C1DF78A2-ACEE-42AB-8020-0289C6E2B26C}.Release|Any CPU.ActiveCfg = Release|Any CPU 22 | {C1DF78A2-ACEE-42AB-8020-0289C6E2B26C}.Release|Any CPU.Build.0 = Release|Any CPU 23 | {D698B899-C670-4A4D-BAB8-1575C1974BAC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 24 | {D698B899-C670-4A4D-BAB8-1575C1974BAC}.Debug|Any CPU.Build.0 = Debug|Any CPU 25 | {D698B899-C670-4A4D-BAB8-1575C1974BAC}.Release|Any CPU.ActiveCfg = Release|Any CPU 26 | {D698B899-C670-4A4D-BAB8-1575C1974BAC}.Release|Any CPU.Build.0 = Release|Any CPU 27 | EndGlobalSection 28 | GlobalSection(SolutionProperties) = preSolution 29 | HideSolutionNode = FALSE 30 | EndGlobalSection 31 | GlobalSection(ExtensibilityGlobals) = postSolution 32 | SolutionGuid = {8BED52C4-E25A-4081-8A1D-5C4B562518C2} 33 | EndGlobalSection 34 | EndGlobal 35 | -------------------------------------------------------------------------------- /JsonFlatten/JsonExtensions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text.RegularExpressions; 5 | using Newtonsoft.Json.Linq; 6 | 7 | namespace JsonFlatten 8 | { 9 | public static class JsonFlattenExtensions 10 | { 11 | /// 12 | /// Flattens a JObject to a Dictionary.null, "", [] and {} are preserved by default 13 | /// 14 | /// JObject to flatten 15 | /// Set to false to ignore JSON properties that are null, "", [] and {} when flattening 16 | public static IDictionary Flatten(this JObject jsonObject, 17 | bool includeNullAndEmptyValues = true) 18 | { 19 | return jsonObject 20 | .Descendants() 21 | .Where(p => !p.Any()) 22 | .Aggregate(new Dictionary(), (properties, jToken) => 23 | { 24 | var value = (jToken as JValue)?.Value; 25 | 26 | if (!includeNullAndEmptyValues) 27 | { 28 | if (value?.Equals(string.Empty) == false) 29 | { 30 | properties.Add(jToken.Path, value); 31 | } 32 | 33 | return properties; 34 | } 35 | 36 | var strVal = jToken.Value()?.ToString().Trim(); 37 | if (strVal?.Equals("[]") == true) 38 | { 39 | value = Enumerable.Empty(); 40 | } 41 | else if (strVal?.Equals("{}") == true) 42 | { 43 | value = new object(); 44 | } 45 | 46 | properties.Add(jToken.Path, value); 47 | 48 | return properties; 49 | }); 50 | } 51 | 52 | /// 53 | /// Unflattens an already flattened JSON Dictionary to its original JSON structure 54 | /// 55 | /// Dictionary to unflatten 56 | public static JObject Unflatten(this IDictionary flattenedJsonKeyValues) 57 | { 58 | JContainer result = null; 59 | var setting = new JsonMergeSettings 60 | { 61 | MergeArrayHandling = MergeArrayHandling.Merge 62 | }; 63 | 64 | foreach (var pathValue in flattenedJsonKeyValues) 65 | { 66 | if (result == null) 67 | { 68 | result = UnflattenSingle(pathValue); 69 | } 70 | else 71 | { 72 | result.Merge(UnflattenSingle(pathValue), setting); 73 | } 74 | } 75 | 76 | return result as JObject; 77 | } 78 | 79 | /// 80 | /// Get an item from the dictionary and cast it to a type. 81 | /// 82 | /// 83 | /// 84 | /// 85 | /// 86 | public static T Get(this IDictionary dictionary, string key) => (T)dictionary[key]; 87 | 88 | /// 89 | /// Update an item in the dictionary 90 | /// 91 | /// 92 | /// 93 | /// 94 | public static void Set(this IDictionary dictionary, string key, object value) => 95 | dictionary[key] = value; 96 | 97 | /// 98 | /// Try get an item from the dictionary and cast it to a type. 99 | /// 100 | /// 101 | /// 102 | /// 103 | /// 104 | /// 105 | public static bool TryGet(this IDictionary dictionary, string key, out T value) 106 | { 107 | if (dictionary.TryGetValue(key, out object result) && result is T) 108 | { 109 | value = (T)result; 110 | return true; 111 | } 112 | 113 | value = default(T); 114 | return false; 115 | } 116 | 117 | private static JContainer UnflattenSingle(KeyValuePair keyValue) 118 | { 119 | var path = keyValue.Key; 120 | var value = keyValue.Value != null ? JToken.FromObject(keyValue.Value) : null; 121 | var pathSegments = SplitPath(path); 122 | 123 | JContainer lastItem = null; 124 | //build from leaf to root 125 | foreach (var pathSegment in pathSegments.Reverse()) 126 | { 127 | if (!IsJsonArray(path, pathSegment)) 128 | { 129 | var obj = new JObject(); 130 | if (lastItem == null) 131 | { 132 | obj.Add(pathSegment, value); 133 | } 134 | else 135 | { 136 | obj.Add(pathSegment, lastItem); 137 | } 138 | 139 | lastItem = obj; 140 | 141 | continue; 142 | } 143 | 144 | var array = new JArray(); 145 | var index = GetArrayIndex(pathSegment); 146 | array = FillEmpty(array, index); 147 | array[index] = lastItem ?? value; 148 | lastItem = array; 149 | } 150 | 151 | return lastItem; 152 | } 153 | 154 | private static IList SplitPath(string path) 155 | { 156 | var reg = new Regex(@" 157 | (?[^.\[\]]+) # Matches property names in dot notation 158 | | 159 | \[(?:'(?[^']*)' # Matches property names enclosed in single quotes 160 | | 161 | ""(?[^""]*)"" # Matches property names enclosed in double quotes 162 | | 163 | (?\d+))\] # Matches array indices 164 | ", RegexOptions.IgnorePatternWhitespace); 165 | 166 | var result = new List(); 167 | 168 | foreach (Match match in reg.Matches(path)) 169 | { 170 | if (match.Groups["singleQuoted"].Success) 171 | { 172 | // Property name enclosed in single quotes 173 | result.Add(match.Groups["singleQuoted"].Value); 174 | } 175 | else if (match.Groups["doubleQuoted"].Success) 176 | { 177 | // Property name enclosed in double quotes 178 | result.Add(match.Groups["doubleQuoted"].Value); 179 | } 180 | else if (match.Groups["index"].Success) 181 | { 182 | // Array index 183 | result.Add(match.Groups["index"].Value); 184 | } 185 | else if (match.Groups["dotNotation"].Success) 186 | { 187 | // Property name in dot notation 188 | result.Add(match.Groups["dotNotation"].Value); 189 | } 190 | } 191 | 192 | return result; 193 | } 194 | 195 | private static JArray FillEmpty(JArray array, int index) 196 | { 197 | for (var i = 0; i <= index; i++) 198 | { 199 | array.Add(null); 200 | } 201 | 202 | return array; 203 | } 204 | 205 | private static bool IsJsonArray(string path, string pathSegment) => 206 | path.Contains("[") && path.Contains("]") && int.TryParse(pathSegment, out _); 207 | 208 | private static int GetArrayIndex(string pathSegment) 209 | { 210 | if (int.TryParse(pathSegment, out var result)) 211 | { 212 | return result; 213 | } 214 | 215 | throw new Exception($"Unable to parse array index: {pathSegment}"); 216 | } 217 | } 218 | } -------------------------------------------------------------------------------- /JsonFlatten/JsonFlatten.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | netstandard1.1 5 | true 6 | GFoley83 7 | JSON, Flatten, Unflatten, Dictionary 8 | Extension methods to flatten or unflatten a JSON.NET JObject to or from an IDictionary<string, object>. 9 | JsonFlatten 10 | https://opensource.org/licenses/MIT 11 | https://github.com/GFoley83/JsonFlatten 12 | https://github.com/GFoley83/JsonFlatten 13 | 1.0.4 14 | 1.0.4 15 | JsonFlatten 16 | https://opensource.org/licenses/MIT 17 | README.md 18 | 10 19 | 20 | 21 | 22 | 23 | True 24 | \ 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Gavin Foley 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Publish-NuGetPackage.ps1: -------------------------------------------------------------------------------- 1 | # Publish-NuGetPackage.ps1 2 | 3 | # Variables 4 | $solutionPath = ".\JsonFlatten.sln" 5 | $projectPath = ".\JsonFlatten\JsonFlatten.csproj" 6 | $testProjectPath = ".\JsonFlatten.Tests\JsonFlatten.Tests.csproj" 7 | $nugetSource = "https://api.nuget.org/v3/index.json" 8 | $nugetApiKey = $env:NUGET_API_KEY 9 | 10 | # Ensure the NuGet API key is set 11 | if ( [string]::IsNullOrEmpty($nugetApiKey)) 12 | { 13 | Write-Error "NuGet API key is not set in the environment variable 'NUGET_API_KEY'." 14 | exit 1 15 | } 16 | 17 | # Step 1: Clean the solution 18 | Write-Host "Cleaning the solution..." 19 | dotnet clean $solutionPath -c Release 20 | 21 | # Step 2: Build the solution in Release mode 22 | Write-Host "Building the solution in Release mode..." 23 | dotnet build $solutionPath -c Release 24 | 25 | # Step 3: Run the tests 26 | Write-Host "Running the tests..." 27 | dotnet test $testProjectPath -c Release 28 | 29 | if ($LASTEXITCODE -ne 0) 30 | { 31 | Write-Error "Tests failed. Aborting." 32 | exit 1 33 | } 34 | 35 | # Step 4: Pack the project to create a NuGet package 36 | Write-Host "Packing the project to create a NuGet package..." 37 | dotnet pack $projectPath -c Release -o ./nupkg 38 | 39 | # Step 5: Find the generated .nupkg file 40 | $nupkgFiles = Get-ChildItem -Path "./nupkg" -Filter "*.nupkg" | Sort-Object LastWriteTime -Descending 41 | if ($nupkgFiles.Count -eq 0) 42 | { 43 | Write-Error "No .nupkg file found in the ./nupkg directory." 44 | exit 1 45 | } 46 | else 47 | { 48 | $nupkgFilePath = $nupkgFiles[0].FullName 49 | Write-Host "Found package: $nupkgFilePath" 50 | } 51 | 52 | # Step 6: Push the package to NuGet.org 53 | Write-Host "Pushing the package to NuGet.org..." 54 | dotnet nuget push $nupkgFilePath -k $nugetApiKey -s $nugetSource 55 | 56 | Write-Host "NuGet package published successfully!" 57 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # JsonFlatten 2 | 3 | Extension methods to flatten or unflatten a JSON.NET `JObject` to or from an `IDictionary`. 4 | 5 | This library is compatible with both .NET and .NET Framework. 6 | 7 | # Example 8 | 9 | https://dotnetfiddle.net/jYghhm 10 | 11 | This: 12 | 13 | ```json 14 | { 15 | "$id": "https://example.com/arrays.schema.json", 16 | "$schema": "http://json-schema.org/draft-07/schema#", 17 | "description": "A representation of a person, company, organization, or place", 18 | "type": "object", 19 | "properties": { 20 | "fruits": { 21 | "type": "array", 22 | "items": { 23 | "type": "string" 24 | } 25 | }, 26 | "vegetables": { 27 | "type": "array", 28 | "items": { "$ref": "#/definitions/veggie" } 29 | } 30 | }, 31 | "definitions": { 32 | "veggie": { 33 | "type": "object", 34 | "required": [ "veggieName", "veggieLike" ], 35 | "properties": { 36 | "veggieName": { 37 | "type": "string", 38 | "description": "The name of the vegetable." 39 | }, 40 | "veggieLike": { 41 | "type": "boolean", 42 | "description": "Do I like this vegetable?" 43 | } 44 | } 45 | } 46 | } 47 | } 48 | ``` 49 | 50 | Becomes this: 51 | 52 | ```json 53 | { 54 | "$id": "https://example.com/arrays.schema.json", 55 | "$schema": "http://json-schema.org/draft-07/schema#", 56 | "description": "A representation of a person, company, organization, or place", 57 | "type": "object", 58 | "properties.fruits.type": "array", 59 | "properties.fruits.items.type": "string", 60 | "properties.vegetables.type": "array", 61 | "properties.vegetables.items.$ref": "#/definitions/veggie", 62 | "definitions.veggie.type": "object", 63 | "definitions.veggie.required[0]": "veggieName", 64 | "definitions.veggie.required[1]": "veggieLike", 65 | "definitions.veggie.properties.veggieName.type": "string", 66 | "definitions.veggie.properties.veggieName.description": "The name of the vegetable.", 67 | "definitions.veggie.properties.veggieLike.type": "boolean", 68 | "definitions.veggie.properties.veggieLike.description": "Do I like this vegetable?" 69 | } 70 | ``` 71 | 72 | ```csharp 73 | using System; 74 | using System.Collections.Generic; 75 | using JsonFlatten; 76 | using Newtonsoft.Json.Linq; 77 | 78 | public class Program 79 | { 80 | public static void Main() 81 | { 82 | var json = @"{ 'array': [ 1, 2, 3 ], 'boolean': true, 'null': null, 'number': 123, 'object': { 'a': 'b', 'c': 'd', 'e': 'f' }, 'date': '2014-01-01T23:28:56.782Z', 'string': 'Hello World', 'emptyString': '', 'emptyObject': {}, 'emptyArray': [] }"; 83 | 84 | JObject jObj = JObject.Parse(json); 85 | 86 | // Flatten a JObject to a dictionary. 87 | var flattened = jObj.Flatten(); 88 | // or Dictionary flattened = new Dictionary(jObj.Flatten()); 89 | 90 | // Retrieve and cast an item from the dictionary 91 | var date = flattened.Get("date"); // 1/1/2014 11:28:56 PM 92 | 93 | // Unflatten a dictionary to a JObject 94 | JObject unflattened = flattened.Unflatten(); 95 | JToken.DeepEquals(jObj, unflattened); // True 96 | 97 | // Update an entry 98 | flattened.Set("date", date.AddDays(5)); 99 | 100 | // Try get logic for properties 101 | flattened.TryGet("date", out var updatedDate); // updatedDate: 1/6/2014 11:28:56 PM 102 | 103 | // Flatten a JObject and exclude any properties that are null or empty e.g. have the value null, "", {}, or [] 104 | var flattenedWithoutEmpty = jObj.Flatten(includeNullAndEmptyValues: false); 105 | } 106 | } 107 | ``` 108 | --------------------------------------------------------------------------------