├── .gitignore
├── README.md
├── README_zh.md
├── app
├── .gitignore
├── build.gradle.kts
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── jiang
│ │ └── json
│ │ └── benchmark
│ │ └── ExampleInstrumentedTest.kt
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── com
│ │ │ └── jiang
│ │ │ └── json
│ │ │ └── benchmark
│ │ │ └── MainActivity.kt
│ └── res
│ │ ├── drawable
│ │ ├── ic_launcher_background.xml
│ │ └── ic_launcher_foreground.xml
│ │ ├── layout
│ │ └── activity_main.xml
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-mdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.webp
│ │ └── ic_launcher_round.webp
│ │ ├── values-night
│ │ └── themes.xml
│ │ ├── values
│ │ ├── colors.xml
│ │ ├── strings.xml
│ │ └── themes.xml
│ │ └── xml
│ │ ├── backup_rules.xml
│ │ └── data_extraction_rules.xml
│ └── test
│ └── java
│ └── com
│ └── jiang
│ └── json
│ └── benchmark
│ └── ExampleUnitTest.kt
├── benchmark
├── .gitignore
├── benchmark-proguard-rules.pro
├── build.gradle.kts
└── src
│ ├── androidTest
│ ├── AndroidManifest.xml
│ └── java
│ │ └── com
│ │ └── jiang
│ │ └── json
│ │ └── benchmark
│ │ ├── JsonStreamBenchmark.kt
│ │ ├── JsonStringBenchmark.kt
│ │ └── KudosBenchmark.kt
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── com
│ │ └── jiang
│ │ └── json
│ │ └── benchmark
│ │ ├── DataClassResponseModels.kt
│ │ ├── JSONObjectSerializer.kt
│ │ ├── JSONReaderSerializer.kt
│ │ ├── KSResponseModels.kt
│ │ ├── KudosGsonResponseModels.kt
│ │ ├── KudosJacksonResponseModels.kt
│ │ ├── KudosJsonReaderResponseModels.kt
│ │ ├── MoshiResponseModels.kt
│ │ ├── ResponseModels.kt
│ │ └── SomeMessageOuterClass.java
│ ├── proto
│ └── SomeMessage.proto
│ └── resources
│ ├── large.bin
│ ├── large.json
│ ├── medium.bin
│ ├── medium.json
│ ├── small.bin
│ └── small.json
├── build.gradle.kts
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle.kts
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | .idea
4 | /local.properties
5 | /.idea/caches
6 | /.idea/libraries
7 | /.idea/modules.xml
8 | /.idea/workspace.xml
9 | /.idea/navEditor.xml
10 | /.idea/assetWizardSettings.xml
11 | .DS_Store
12 | /build
13 | /captures
14 | .externalNativeBuild
15 | .cxx
16 | local.properties
17 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | English | **[简体中文](README_zh.md)**
2 |
3 | # json-benchmark
4 | - Use the Jetpack Microbenchmark library for benchmark testing to avoid the impact of CPU frequency reduction and JIT optimization on test results.
5 | - The test case input includes three json files of size 12kb, 78kb, and 238kb to test the impact of json size on deserialization speed.
6 | - The test results are divided into multiple runs with sufficient preheating and one run without preheating to test the difference in deserialization speed under cold start.
7 |
8 | ## Test results
9 | ### Multi-run test results
10 | | | small json | medium json | large json |
11 | |----------------------|----------------|----------------|----------------|
12 | | Kotlin Serialization | 165,936 ns | 997,228 ns | 2,933,098 ns |
13 | | JSONReader | 190,902 ns | 1,164,605 ns | 3,412,914 ns |
14 | | FastJson | 196,860 ns | 1,417,077 ns | 4,218,987 ns |
15 | | JSONObject | 258,789 ns | 1,690,190 ns | 4,788,937 ns |
16 | | Moshi | 303,056 ns | 1,411,364 ns | 3,955,789 ns |
17 | | Gson | 412,421 ns | 1,356,564 ns | 3,557,943 ns |
18 | | Jackson | 1,073,504 ns | 1,798,989 ns | 3,543,983 ns |
19 |
20 |
21 | 
22 |
23 | ### One-run test results
24 | | | small json | medium json | large json |
25 | |----------------------|-----------------|-----------------|-----------------|
26 | | Kotlin Serialization | 4,114,323 ns | 15,739,688 ns | 17,428,906 ns |
27 | | JSONReader | 630,469 ns | 2,052,501 ns | 5,630,261 ns |
28 | | FastJson | 61,629,844 ns | 6,756,823 ns | 10,529,791 ns |
29 | | JSONObject | 580,469 ns | 2,227,290 ns | 6,311,667 ns |
30 | | Moshi | 4,460,886 ns | 13,854,792 ns | 18,951,198 ns |
31 | | Gson | 3,319,688 ns | 5,568,906 ns | 10,264,635 ns |
32 | | Jackson | 15,070,469 ns | 13,625,521 ns | 17,914,687 ns |
33 |
34 |
35 | 
36 |
37 | ## Kudos test results
38 | [Kudos](https://github.com/kanyun-inc/Kudos) is short for Kotlin utilities for deserializing objects. It is designed to make it safer and easier to deserializing Kotlin classes with Gson and Jackson.
39 |
40 | Based on the working mechanism of Kudos, it is not difficult to think that the running time of Kudos will be slightly longer than the corresponding JSON serialization framework. The following is a comparison of the running time of Kudos and the corresponding JSON serialization framework:
41 |
42 | ### Multi-run test results
43 | | | small json | medium json | large json |
44 | |------------------|----------------|----------------|----------------|
45 | | Gson | 412,375 ns | 1,374,838 ns | 3,641,904 ns |
46 | | Kudos-Gson | 517,123 ns | 1,686,568 ns | 4,311,910 ns |
47 | | Jackson | 1,035,010 ns | 1,750,709 ns | 3,450,974 ns |
48 | | Kudos-Jackson | 1,261,026 ns | 2,030,874 ns | 3,939,600 ns |
49 | | JsonReader | 190,302 ns | 1,176,479 ns | 3,464,174 ns |
50 | | Kudos-JsonReader | 215,974 ns | 1,359,587 ns | 4,019,024 ns |
51 |
52 | ### One-run test results
53 | | | small json | medium json | large json |
54 | |------------------|-----------------|-----------------|-----------------|
55 | | Gson | 3,974,219 ns | 4,666,927 ns | 8,271,355 ns |
56 | | Kudos-Gson | 4,531,718 ns | 6,244,479 ns | 11,160,782 ns |
57 | | Jackson | 12,821,094 ns | 13,930,625 ns | 15,989,791 ns |
58 | | Kudos-Jackson | 13,233,750 ns | 15,674,010 ns | 18,641,302 ns |
59 | | JsonReader | 662,032 ns | 2,056,666 ns | 4,624,687 ns |
60 | | Kudos-JsonReader | 734,907 ns | 2,362,010 ns | 6,212,917 ns |
61 |
62 | ## More
63 | [Performance comparison of commonly used JSON libraries](https://android-performance-optimization.github.io/practical/speed/json-serialization-speed/)
64 |
65 |
66 |
--------------------------------------------------------------------------------
/README_zh.md:
--------------------------------------------------------------------------------
1 | **[English](README.md)** | 简体中文
2 |
3 | # json-benchmark
4 | - 通过 Jetpack Microbenchmark 库进行基准测试,以避免 CPU 降频,JIT 优化对测试结果的影响
5 | - 测试用例输入包括 12kb, 78kb, 238kb 大小的三个 json 文件,以测试 json 大小对反序列化速度的影响
6 | - 测试结果分为多次运行充分预热与一次运行无预热两种情况,以测试在冷启动情况下反序列化速度的差异
7 |
8 | ## 测试结果
9 | ### 多次运行测试结果
10 | | | small json | medium json | large json |
11 | |----------------------|----------------|----------------|----------------|
12 | | Kotlin Serialization | 165,936 ns | 997,228 ns | 2,933,098 ns |
13 | | JSONReader | 190,902 ns | 1,164,605 ns | 3,412,914 ns |
14 | | FastJson | 196,860 ns | 1,417,077 ns | 4,218,987 ns |
15 | | JSONObject | 258,789 ns | 1,690,190 ns | 4,788,937 ns |
16 | | Moshi | 303,056 ns | 1,411,364 ns | 3,955,789 ns |
17 | | Gson | 412,421 ns | 1,356,564 ns | 3,557,943 ns |
18 | | Jackson | 1,073,504 ns | 1,798,989 ns | 3,543,983 ns |
19 |
20 |
21 | 
22 |
23 | ### 一次运行测试结果
24 | | | small json | medium json | large json |
25 | |----------------------|-----------------|-----------------|-----------------|
26 | | Kotlin Serialization | 4,114,323 ns | 15,739,688 ns | 17,428,906 ns |
27 | | JSONReader | 630,469 ns | 2,052,501 ns | 5,630,261 ns |
28 | | FastJson | 61,629,844 ns | 6,756,823 ns | 10,529,791 ns |
29 | | JSONObject | 580,469 ns | 2,227,290 ns | 6,311,667 ns |
30 | | Moshi | 4,460,886 ns | 13,854,792 ns | 18,951,198 ns |
31 | | Gson | 3,319,688 ns | 5,568,906 ns | 10,264,635 ns |
32 | | Jackson | 15,070,469 ns | 13,625,521 ns | 17,914,687 ns |
33 |
34 |
35 | 
36 |
37 | ## Kudos 测试结果
38 | [Kudos](https://github.com/kanyun-inc/Kudos) 是 Kotlin utilities for deserializing objects 的缩写。它可以解决使用 Gson、Jackson 等框架反序列化 JSON 到 Kotlin 类时所存在的空安全问题和构造器默认值失效的问题。
39 |
40 | 基于 Kudos 的工作机制不难想到,Kudos 的运行耗时会略微多于对应的 JSON 序列化框架。下面是 Kudos 与对应的 JSON 序列化框架的运行耗时对比。
41 |
42 | ### 多次运行测试结果
43 | | | small json | medium json | large json |
44 | |------------------|----------------|----------------|----------------|
45 | | Gson | 412,375 ns | 1,374,838 ns | 3,641,904 ns |
46 | | Kudos-Gson | 517,123 ns | 1,686,568 ns | 4,311,910 ns |
47 | | Jackson | 1,035,010 ns | 1,750,709 ns | 3,450,974 ns |
48 | | Kudos-Jackson | 1,261,026 ns | 2,030,874 ns | 3,939,600 ns |
49 | | JsonReader | 190,302 ns | 1,176,479 ns | 3,464,174 ns |
50 | | Kudos-JsonReader | 215,974 ns | 1,359,587 ns | 4,019,024 ns |
51 |
52 | ### 一次运行测试结果
53 | | | small json | medium json | large json |
54 | |------------------|-----------------|-----------------|-----------------|
55 | | Gson | 3,974,219 ns | 4,666,927 ns | 8,271,355 ns |
56 | | Kudos-Gson | 4,531,718 ns | 6,244,479 ns | 11,160,782 ns |
57 | | Jackson | 12,821,094 ns | 13,930,625 ns | 15,989,791 ns |
58 | | Kudos-Jackson | 13,233,750 ns | 15,674,010 ns | 18,641,302 ns |
59 | | JsonReader | 662,032 ns | 2,056,666 ns | 4,624,687 ns |
60 | | Kudos-JsonReader | 734,907 ns | 2,362,010 ns | 6,212,917 ns |
61 |
62 | ## 更多
63 | [常用 JSON 库性能对比](https://android-performance-optimization.github.io/practical/speed/json-serialization-speed/)
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/app/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | id("com.android.application")
3 | id("org.jetbrains.kotlin.android")
4 | }
5 |
6 | android {
7 | namespace = "com.jiang.json.benchmark"
8 | compileSdk = 33
9 |
10 | defaultConfig {
11 | applicationId = "com.jiang.json.benchmark"
12 | minSdk = 24
13 | targetSdk = 33
14 | versionCode = 1
15 | versionName = "1.0"
16 |
17 | testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
18 | }
19 |
20 | buildTypes {
21 | release {
22 | isMinifyEnabled = false
23 | proguardFiles(
24 | getDefaultProguardFile("proguard-android-optimize.txt"),
25 | "proguard-rules.pro"
26 | )
27 | }
28 | }
29 | compileOptions {
30 | sourceCompatibility = JavaVersion.VERSION_1_8
31 | targetCompatibility = JavaVersion.VERSION_1_8
32 | }
33 | kotlinOptions {
34 | jvmTarget = "1.8"
35 | }
36 | }
37 |
38 | dependencies {
39 |
40 | implementation("androidx.core:core-ktx:1.9.0")
41 | implementation("androidx.appcompat:appcompat:1.6.1")
42 | implementation("com.google.android.material:material:1.8.0")
43 | implementation("androidx.constraintlayout:constraintlayout:2.1.4")
44 | testImplementation("junit:junit:4.13.2")
45 | androidTestImplementation("androidx.test.ext:junit:1.1.5")
46 | androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
47 | }
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/jiang/json/benchmark/ExampleInstrumentedTest.kt:
--------------------------------------------------------------------------------
1 | package com.jiang.json.benchmark
2 |
3 | import androidx.test.platform.app.InstrumentationRegistry
4 | import androidx.test.ext.junit.runners.AndroidJUnit4
5 |
6 | import org.junit.Test
7 | import org.junit.runner.RunWith
8 |
9 | import org.junit.Assert.*
10 |
11 | /**
12 | * Instrumented test, which will execute on an Android device.
13 | *
14 | * See [testing documentation](http://d.android.com/tools/testing).
15 | */
16 | @RunWith(AndroidJUnit4::class)
17 | class ExampleInstrumentedTest {
18 | @Test
19 | fun useAppContext() {
20 | // Context of the app under test.
21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext
22 | assertEquals("com.jiang.json.benchmark", appContext.packageName)
23 | }
24 | }
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
15 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/app/src/main/java/com/jiang/json/benchmark/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.jiang.json.benchmark
2 |
3 | import androidx.appcompat.app.AppCompatActivity
4 | import android.os.Bundle
5 |
6 | class MainActivity : AppCompatActivity() {
7 | override fun onCreate(savedInstanceState: Bundle?) {
8 | super.onCreate(savedInstanceState)
9 | setContentView(R.layout.activity_main)
10 | }
11 | }
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
15 |
20 |
25 |
30 |
35 |
40 |
45 |
50 |
55 |
60 |
65 |
70 |
75 |
80 |
85 |
90 |
95 |
100 |
105 |
110 |
115 |
120 |
125 |
130 |
135 |
140 |
145 |
150 |
155 |
160 |
165 |
170 |
171 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
15 |
18 |
21 |
22 |
23 |
24 |
30 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
17 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RicardoJiang/json-benchmark/61d5664445f3fe5f5bf16e695454a482e00b98e6/app/src/main/res/mipmap-hdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RicardoJiang/json-benchmark/61d5664445f3fe5f5bf16e695454a482e00b98e6/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RicardoJiang/json-benchmark/61d5664445f3fe5f5bf16e695454a482e00b98e6/app/src/main/res/mipmap-mdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RicardoJiang/json-benchmark/61d5664445f3fe5f5bf16e695454a482e00b98e6/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RicardoJiang/json-benchmark/61d5664445f3fe5f5bf16e695454a482e00b98e6/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RicardoJiang/json-benchmark/61d5664445f3fe5f5bf16e695454a482e00b98e6/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RicardoJiang/json-benchmark/61d5664445f3fe5f5bf16e695454a482e00b98e6/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RicardoJiang/json-benchmark/61d5664445f3fe5f5bf16e695454a482e00b98e6/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RicardoJiang/json-benchmark/61d5664445f3fe5f5bf16e695454a482e00b98e6/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RicardoJiang/json-benchmark/61d5664445f3fe5f5bf16e695454a482e00b98e6/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/values-night/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FF000000
4 | #FFFFFFFF
5 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | json-benchmark
3 |
--------------------------------------------------------------------------------
/app/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/backup_rules.xml:
--------------------------------------------------------------------------------
1 |
8 |
9 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/data_extraction_rules.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
12 |
13 |
19 |
--------------------------------------------------------------------------------
/app/src/test/java/com/jiang/json/benchmark/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | package com.jiang.json.benchmark
2 |
3 | import org.junit.Test
4 |
5 | import org.junit.Assert.*
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * See [testing documentation](http://d.android.com/tools/testing).
11 | */
12 | class ExampleUnitTest {
13 | @Test
14 | fun addition_isCorrect() {
15 | assertEquals(4, 2 + 2)
16 | }
17 | }
--------------------------------------------------------------------------------
/benchmark/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/benchmark/benchmark-proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
23 | -dontobfuscate
24 |
25 | -ignorewarnings
26 |
27 | -keepattributes *Annotation*
28 |
29 | -dontnote junit.framework.**
30 | -dontnote junit.runner.**
31 |
32 | -dontwarn androidx.test.**
33 | -dontwarn org.junit.**
34 | -dontwarn org.hamcrest.**
35 | -dontwarn com.squareup.javawriter.JavaWriter
36 |
37 | -keepclasseswithmembers @org.junit.runner.RunWith public class *
--------------------------------------------------------------------------------
/benchmark/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | id("com.android.library")
3 | id("androidx.benchmark")
4 | id("org.jetbrains.kotlin.android")
5 | id("com.google.devtools.ksp")
6 | id("com.kanyun.kudos")
7 | kotlin("plugin.serialization") version "1.8.20"
8 | }
9 |
10 | kudos {
11 | // Enable Kudos.Gson. Generate @JsonAdapter for kudos classes and add kudos-gson to dependencies.
12 | gson = true
13 | // Enable Kudos.Jackson. Add kudos-jackson to dependencies.
14 | jackson = true
15 | // Enable Kudos.AndroidJsonReader. Add kudos-android-json-reader to dependencies.
16 | androidJsonReader = true
17 | }
18 |
19 | android {
20 | namespace = "com.jiang.json.benchmark"
21 | compileSdk = 33
22 |
23 | compileOptions {
24 | sourceCompatibility = JavaVersion.VERSION_1_8
25 | targetCompatibility = JavaVersion.VERSION_1_8
26 | }
27 |
28 | kotlinOptions {
29 | jvmTarget = "1.8"
30 | }
31 |
32 | defaultConfig {
33 | minSdk = 24
34 | targetSdk = 33
35 |
36 | testInstrumentationRunner = "androidx.benchmark.junit4.AndroidBenchmarkRunner"
37 | // testInstrumentationRunnerArguments["androidx.benchmark.profiling.mode"] = "StackSampling"
38 | // testInstrumentationRunnerArguments["androidx.benchmark.dryRunMode.enable"] = "true"
39 | }
40 |
41 | testBuildType = "release"
42 | buildTypes {
43 | debug {
44 | // Since isDebuggable can"t be modified by gradle for library modules,
45 | // it must be done in a manifest - see src/androidTest/AndroidManifest.xml
46 | isMinifyEnabled = true
47 | proguardFiles(
48 | getDefaultProguardFile("proguard-android-optimize.txt"),
49 | "benchmark-proguard-rules.pro"
50 | )
51 | }
52 | release {
53 | isDefault = true
54 | }
55 | }
56 | }
57 |
58 | dependencies {
59 | androidTestImplementation("androidx.test:runner:1.5.2")
60 | androidTestImplementation("androidx.test.ext:junit:1.1.5")
61 | androidTestImplementation("junit:junit:4.13.2")
62 | androidTestImplementation("androidx.benchmark:benchmark-junit4:1.1.1")
63 | // Add your dependencies here. Note that you cannot benchmark code
64 | // in an app module this way - you will need to move any code you
65 | // want to benchmark to a library module:
66 | // https://developer.android.com/studio/projects/android-library#Convert
67 | implementation("com.google.guava:guava:31.1-jre")
68 | implementation("com.google.code.gson:gson:2.10")
69 | implementation("com.squareup.moshi:moshi-kotlin:1.14.0")
70 | implementation("com.fasterxml.jackson.core:jackson-databind:2.15.2")
71 | implementation("com.alibaba.fastjson2:fastjson2:2.0.40.android4")
72 | implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")
73 | implementation("com.google.protobuf:protobuf-java:3.24.3")
74 | implementation("com.google.protobuf:protobuf-java-util:3.24.3")
75 | ksp("com.squareup.moshi:moshi-kotlin-codegen:1.14.0")
76 | }
--------------------------------------------------------------------------------
/benchmark/src/androidTest/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
11 |
15 |
--------------------------------------------------------------------------------
/benchmark/src/androidTest/java/com/jiang/json/benchmark/JsonStreamBenchmark.kt:
--------------------------------------------------------------------------------
1 | package com.jiang.json.benchmark
2 |
3 | import androidx.benchmark.junit4.BenchmarkRule
4 | import androidx.benchmark.junit4.measureRepeated
5 | import androidx.test.filters.LargeTest
6 | import com.alibaba.fastjson2.JSON
7 | import com.fasterxml.jackson.databind.DeserializationFeature
8 | import com.fasterxml.jackson.databind.ObjectMapper
9 | import com.google.common.io.Resources
10 | import com.google.gson.Gson
11 | import com.squareup.moshi.Moshi
12 | import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
13 | import kotlinx.serialization.ExperimentalSerializationApi
14 | import kotlinx.serialization.json.Json
15 | import kotlinx.serialization.json.decodeFromStream
16 | import okio.buffer
17 | import okio.source
18 | import org.junit.FixMethodOrder
19 | import org.junit.Rule
20 | import org.junit.Test
21 | import org.junit.runner.RunWith
22 | import org.junit.runners.MethodSorters
23 | import org.junit.runners.Parameterized
24 | import java.io.InputStreamReader
25 |
26 | /**
27 | * Benchmark, which will execute on an Android device.
28 | *
29 | * The body of [BenchmarkRule.measureRepeated] is measured in a loop, and Studio will
30 | * output the result. Modify your code to see how it affects performance.
31 | */
32 | @LargeTest
33 | @RunWith(Parameterized::class)
34 | @FixMethodOrder(MethodSorters.NAME_ASCENDING)
35 | class JsonStreamBenchmark(val jsonName: String, val pbName: String) {
36 |
37 | companion object {
38 | @JvmStatic
39 | @Parameterized.Parameters(name = "size={0}")
40 | fun data(): List> {
41 | return listOf(
42 | arrayOf("small.json", "small.bin"),
43 | arrayOf("medium.json", "medium.bin"),
44 | arrayOf("large.json", "large.bin")
45 | )
46 | }
47 | }
48 |
49 | @get:Rule
50 | val benchmarkRule = BenchmarkRule()
51 | private val jsonResource = Resources.getResource(jsonName)
52 | private val pbResource = Resources.getResource(pbName)
53 |
54 | @Test
55 | fun testGson() {
56 | benchmarkRule.measureRepeated {
57 | val source = runWithTimingDisabled {
58 | jsonResource.openStream()
59 | }
60 | val gson = Gson()
61 | val reader = gson.newJsonReader(InputStreamReader(source))
62 | val result = gson.fromJson(reader, KRResponse::class.java)
63 | println("gson $jsonName size: ${result?.users?.size}")
64 | }
65 | }
66 |
67 | @Test
68 | fun testMoshi() {
69 | benchmarkRule.measureRepeated {
70 | val source = runWithTimingDisabled {
71 | jsonResource.openStream()
72 | }
73 | val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build()
74 | val jsonAdapter = moshi.adapter(MoshiKRResponse::class.java)
75 | val result = jsonAdapter.fromJson(source.source().buffer())
76 | println("moshi $jsonName size: ${result?.users?.size}")
77 | }
78 | }
79 |
80 | @Test
81 | fun testJackson() {
82 | benchmarkRule.measureRepeated {
83 | val source = runWithTimingDisabled {
84 | jsonResource.openStream()
85 | }
86 | val mapper = ObjectMapper()
87 | mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
88 | mapper.disable(DeserializationFeature.WRAP_EXCEPTIONS)
89 | val result = mapper.readValue(source, KRResponse::class.java)
90 | println("jackson $jsonName size: ${result?.users?.size}")
91 | }
92 | }
93 |
94 | @Test
95 | fun testFastJson() {
96 | benchmarkRule.measureRepeated {
97 | val source = runWithTimingDisabled {
98 | jsonResource.openStream()
99 | }
100 | val result = JSON.parseObject(source, KRResponse::class.java)
101 | println("fastJson $jsonName size: ${result?.users?.size}")
102 | }
103 | }
104 |
105 | @OptIn(ExperimentalSerializationApi::class)
106 | @Test
107 | fun testKotlinSerialization() {
108 | benchmarkRule.measureRepeated {
109 | val source = runWithTimingDisabled {
110 | jsonResource.openStream()
111 | }
112 | val json = Json { ignoreUnknownKeys = true }
113 | val result = json.decodeFromStream(source)
114 | println("KotlinSerialization $jsonName size: ${result.users.size}")
115 | }
116 | }
117 |
118 | @Test
119 | fun testJsonObject() {
120 | benchmarkRule.measureRepeated {
121 | val source = runWithTimingDisabled {
122 | jsonResource.openStream()
123 | }
124 | val result = JSONObjectSerializer().parse(source.bufferedReader().readText())
125 | println("JSONObject $jsonName size: ${result.users.size}")
126 | }
127 | }
128 |
129 | @Test
130 | fun testJSONReader() {
131 | benchmarkRule.measureRepeated {
132 | val source = runWithTimingDisabled {
133 | jsonResource.openStream()
134 | }
135 | val result = JSONReaderSerializer().parse(source)
136 | println("JSONReader $jsonName size: ${result.users.size}")
137 | }
138 | }
139 |
140 | @Test
141 | fun testProtobuf(){
142 | benchmarkRule.measureRepeated {
143 | val source = runWithTimingDisabled {
144 | pbResource.openStream()
145 | }
146 | val result = SomeMessageOuterClass.SomeMessage.parseFrom(source)
147 | println("pb $jsonName size: ${result?.usersList?.size}")
148 | }
149 | }
150 | }
--------------------------------------------------------------------------------
/benchmark/src/androidTest/java/com/jiang/json/benchmark/JsonStringBenchmark.kt:
--------------------------------------------------------------------------------
1 | package com.jiang.json.benchmark
2 |
3 | import androidx.benchmark.junit4.BenchmarkRule
4 | import androidx.benchmark.junit4.measureRepeated
5 | import androidx.test.filters.LargeTest
6 | import com.alibaba.fastjson2.JSON
7 | import com.fasterxml.jackson.databind.DeserializationFeature
8 | import com.fasterxml.jackson.databind.ObjectMapper
9 | import com.google.common.io.Resources
10 | import com.google.gson.Gson
11 | import com.squareup.moshi.Moshi
12 | import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
13 | import kotlinx.serialization.ExperimentalSerializationApi
14 | import kotlinx.serialization.json.Json
15 | import org.junit.FixMethodOrder
16 | import org.junit.Rule
17 | import org.junit.Test
18 | import org.junit.runner.RunWith
19 | import org.junit.runners.MethodSorters
20 | import org.junit.runners.Parameterized
21 |
22 | /**
23 | * Benchmark, which will execute on an Android device.
24 | *
25 | * The body of [BenchmarkRule.measureRepeated] is measured in a loop, and Studio will
26 | * output the result. Modify your code to see how it affects performance.
27 | */
28 | @LargeTest
29 | @RunWith(Parameterized::class)
30 | @FixMethodOrder(MethodSorters.NAME_ASCENDING)
31 | class JsonStringBenchmark(val resourceName: String) {
32 |
33 | companion object {
34 | @JvmStatic
35 | @Parameterized.Parameters(name = "size={0}")
36 | fun data(): List> {
37 | return listOf(
38 | arrayOf("small.json"),
39 | arrayOf("medium.json"),
40 | arrayOf("large.json")
41 | )
42 | }
43 | }
44 |
45 | @get:Rule
46 | val benchmarkRule = BenchmarkRule()
47 | private val resource = Resources.getResource(resourceName)
48 |
49 | @Test
50 | fun testGson() {
51 | benchmarkRule.measureRepeated {
52 | val source = runWithTimingDisabled {
53 | resource.readText()
54 | }
55 | val gson = Gson()
56 | val result = gson.fromJson(source, KRResponse::class.java)
57 | println("gson $resourceName size: ${result?.users?.size}")
58 | }
59 | }
60 |
61 | @Test
62 | fun testMoshi() {
63 | benchmarkRule.measureRepeated {
64 | val source = runWithTimingDisabled {
65 | resource.readText()
66 | }
67 | val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build()
68 | val jsonAdapter = moshi.adapter(MoshiKRResponse::class.java)
69 | val result = jsonAdapter.fromJson(source)
70 | println("moshi $resourceName size: ${result?.users?.size}")
71 | }
72 | }
73 |
74 | @Test
75 | fun testJackson() {
76 | benchmarkRule.measureRepeated {
77 | val source = runWithTimingDisabled {
78 | resource.readText()
79 | }
80 | val mapper = ObjectMapper()
81 | mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
82 | mapper.disable(DeserializationFeature.WRAP_EXCEPTIONS)
83 | val result = mapper.readValue(source, KRResponse::class.java)
84 | println("jackson $resourceName size: ${result?.users?.size}")
85 | }
86 | }
87 |
88 | @Test
89 | fun testFastJson() {
90 | benchmarkRule.measureRepeated {
91 | val source = runWithTimingDisabled {
92 | resource.readText()
93 | }
94 | val result = JSON.parseObject(source, KRResponse::class.java)
95 | println("fastJson $resourceName size: ${result?.users?.size}")
96 | }
97 | }
98 |
99 | @OptIn(ExperimentalSerializationApi::class)
100 | @Test
101 | fun testKotlinSerialization() {
102 | benchmarkRule.measureRepeated {
103 | val source = runWithTimingDisabled {
104 | resource.readText()
105 | }
106 | val json = Json { ignoreUnknownKeys = true }
107 | val result = json.decodeFromString(source)
108 | println("KotlinSerialization $resourceName size: ${result.users.size}")
109 | }
110 | }
111 |
112 | @Test
113 | fun testJsonObject() {
114 | benchmarkRule.measureRepeated {
115 | val source = runWithTimingDisabled {
116 | resource.readText()
117 | }
118 | val result = JSONObjectSerializer().parse(source)
119 | println("JSONObject $resourceName size: ${result.users.size}")
120 | }
121 | }
122 |
123 | @Test
124 | fun testJSONReader() {
125 | benchmarkRule.measureRepeated {
126 | val source = runWithTimingDisabled {
127 | resource.readText()
128 | }
129 | val result = JSONReaderSerializer().parse(source.byteInputStream())
130 | println("JSONReader $resourceName size: ${result.users.size}")
131 | }
132 | }
133 | }
--------------------------------------------------------------------------------
/benchmark/src/androidTest/java/com/jiang/json/benchmark/KudosBenchmark.kt:
--------------------------------------------------------------------------------
1 | package com.jiang.json.benchmark
2 |
3 | import androidx.benchmark.junit4.BenchmarkRule
4 | import androidx.benchmark.junit4.measureRepeated
5 | import androidx.test.filters.LargeTest
6 | import com.fasterxml.jackson.databind.DeserializationFeature
7 | import com.fasterxml.jackson.databind.ObjectMapper
8 | import com.google.common.io.Resources
9 | import com.google.gson.Gson
10 | import com.kanyun.kudos.gson.kudosGson
11 | import com.kanyun.kudos.jackson.kudosObjectMapper
12 | import com.kanyun.kudos.json.reader.KudosAndroidJsonReader
13 | import org.junit.FixMethodOrder
14 | import org.junit.Rule
15 | import org.junit.Test
16 | import org.junit.runner.RunWith
17 | import org.junit.runners.MethodSorters
18 | import org.junit.runners.Parameterized
19 | import java.io.InputStreamReader
20 |
21 | /**
22 | * Benchmark, which will execute on an Android device.
23 | *
24 | * The body of [BenchmarkRule.measureRepeated] is measured in a loop, and Studio will
25 | * output the result. Modify your code to see how it affects performance.
26 | */
27 | @LargeTest
28 | @RunWith(Parameterized::class)
29 | @FixMethodOrder(MethodSorters.NAME_ASCENDING)
30 | class KudosBenchmark(val resourceName: String) {
31 |
32 | companion object {
33 | @JvmStatic
34 | @Parameterized.Parameters(name = "size={0}")
35 | fun data(): List> {
36 | return listOf(
37 | arrayOf("small.json"),
38 | arrayOf("medium.json"),
39 | arrayOf("large.json")
40 | )
41 | }
42 | }
43 |
44 | @get:Rule
45 | val benchmarkRule = BenchmarkRule()
46 | private val resource = Resources.getResource(resourceName)
47 |
48 | @Test
49 | fun testGson() {
50 | benchmarkRule.measureRepeated {
51 | val source = runWithTimingDisabled {
52 | resource.openStream()
53 | }
54 | val gson = Gson()
55 | val reader = gson.newJsonReader(InputStreamReader(source))
56 | val result = gson.fromJson(reader, KRResponse::class.java)
57 | println("gson $resourceName size: ${result?.users?.size}")
58 | }
59 | }
60 |
61 | @Test
62 | fun testKudosGson() {
63 | benchmarkRule.measureRepeated {
64 | val source = runWithTimingDisabled {
65 | resource.openStream()
66 | }
67 | val gson = kudosGson()
68 | val reader = gson.newJsonReader(InputStreamReader(source))
69 | val result = gson.fromJson(reader, KudosGsonResponse::class.java)
70 | println("kudosGson $resourceName size: ${result?.users?.size}")
71 | }
72 | }
73 |
74 | @Test
75 | fun testJackson() {
76 | benchmarkRule.measureRepeated {
77 | val source = runWithTimingDisabled {
78 | resource.openStream()
79 | }
80 | val mapper = ObjectMapper()
81 | mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
82 | mapper.disable(DeserializationFeature.WRAP_EXCEPTIONS)
83 | val result = mapper.readValue(source, KRResponse::class.java)
84 | println("jackson $resourceName size: ${result?.users?.size}")
85 | }
86 | }
87 |
88 | @Test
89 | fun testKudosJackson() {
90 | benchmarkRule.measureRepeated {
91 | val source = runWithTimingDisabled {
92 | resource.openStream()
93 | }
94 | val mapper = kudosObjectMapper()
95 | mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
96 | mapper.disable(DeserializationFeature.WRAP_EXCEPTIONS)
97 | val result = mapper.readValue(source, KudosJacksonResponse::class.java)
98 | println("kudosJackson $resourceName size: ${result?.users?.size}")
99 | }
100 | }
101 |
102 | @Test
103 | fun testJsonReader() {
104 | benchmarkRule.measureRepeated {
105 | val source = runWithTimingDisabled {
106 | resource.openStream()
107 | }
108 | val result = JSONReaderSerializer().parse(source)
109 | println("JSONReader $resourceName size: ${result.users.size}")
110 | }
111 | }
112 |
113 | @Test
114 | fun testKudosJsonReader(){
115 | benchmarkRule.measureRepeated {
116 | val source = runWithTimingDisabled {
117 | resource.openStream()
118 | }
119 | val result = KudosAndroidJsonReader.fromJson(source)
120 | println("kudosAndroidJsonReader $resourceName size: ${result.users?.size}")
121 | }
122 | }
123 | }
--------------------------------------------------------------------------------
/benchmark/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/benchmark/src/main/java/com/jiang/json/benchmark/DataClassResponseModels.kt:
--------------------------------------------------------------------------------
1 | package com.jiang.json.benchmark
2 |
3 | data class KRResponseDataClass(
4 | val users: List,
5 | val status: String,
6 | val is_real_json: Boolean
7 | )
8 |
9 | data class KRUserDataClass(
10 | val _id: String,
11 | val index: Int,
12 | val guid: String,
13 | val is_active: Boolean,
14 | val balance: String,
15 | val picture: String,
16 | val age: Int,
17 | val name: KRNameDataClass,
18 | val company: String,
19 | val email: String,
20 | val address: String,
21 | val about: String,
22 | val registered: String,
23 | val latitude: Double,
24 | val longitude: Double,
25 | val tags: List,
26 | val range: List,
27 | val friends: List,
28 | val images: List,
29 | val greeting: String,
30 | val favorite_fruit: String,
31 | val eye_color: String,
32 | val phone: String
33 | )
34 |
35 | class KRNameDataClass(
36 | val first: String,
37 | val last: String
38 | )
39 |
40 | data class KRFriendDataClass(
41 | val id: Int,
42 | val name: String
43 | )
44 |
45 | class KRImageDataClass(
46 | val id: String,
47 | val format: String,
48 | val url: String,
49 | val description: String
50 | )
--------------------------------------------------------------------------------
/benchmark/src/main/java/com/jiang/json/benchmark/JSONObjectSerializer.kt:
--------------------------------------------------------------------------------
1 | package com.jiang.json.benchmark
2 |
3 | import org.json.JSONArray
4 | import org.json.JSONObject
5 |
6 | class JSONObjectSerializer {
7 |
8 | fun parse(text: String): KRResponseDataClass {
9 | val jsonObject = JSONObject(text)
10 | val result = KRResponseDataClass(users = jsonObject.optJSONArray("users")?.map { userArray, userIndex ->
11 | val user = userArray.optJSONObject(userIndex)
12 | KRUserDataClass(
13 | _id = user.optString("_id"),
14 | index = user.optInt("index"),
15 | guid = user.optString("guid"),
16 | is_active = user.optBoolean("is_active"),
17 | balance = user.optString("balance"),
18 | picture = user.optString("picture"),
19 | age = user.optInt("age"),
20 | name = user.optJSONObject("name")?.let { nameJsonObject ->
21 | KRNameDataClass(
22 | first = nameJsonObject.optString("first"),
23 | last = nameJsonObject.optString("last")
24 | )
25 | } ?: KRNameDataClass(first = "", last = ""),
26 | company = user.optString("company"),
27 | email = user.optString("email"),
28 | address = user.optString("address"),
29 | about = user.optString("about"),
30 | registered = user.optString("registered"),
31 | latitude = user.optDouble("latitude"),
32 | longitude = user.optDouble("longitude"),
33 | tags = user.optJSONArray("tags")?.map { tagArray, tagIndex ->
34 | tagArray.optString(tagIndex)
35 | } ?: emptyList(),
36 | range = user.optJSONArray("range")?.map { rangeArray, rangeIndex ->
37 | rangeArray.optInt(rangeIndex)
38 | } ?: emptyList(),
39 | friends = user.optJSONArray("friends")?.map { friendArray, friendIndex ->
40 | val friend = friendArray.optJSONObject(friendIndex)
41 | KRFriendDataClass(
42 | id = friend.optInt("id"),
43 | name = friend.optString("name")
44 | )
45 | } ?: emptyList(),
46 | images = user.optJSONArray("images")?.map { imageArray, imageIndex ->
47 | val image = imageArray.optJSONObject(imageIndex)
48 | KRImageDataClass(
49 | id = image.optString("id"),
50 | format = image.optString("format"),
51 | url = image.optString("url"),
52 | description = image.optString("description")
53 | )
54 | } ?: emptyList(),
55 | greeting = user.optString("greeting"),
56 | favorite_fruit = user.optString("favorite_fruit"),
57 | eye_color = user.optString("eye_color"),
58 | phone = user.optString("phone")
59 | )
60 | } ?: emptyList(),
61 | status = jsonObject.optString("status"),
62 | is_real_json = jsonObject.optBoolean("is_real_json")
63 | )
64 | return result
65 | }
66 |
67 | private inline fun JSONArray.map(block: (JSONArray, Int) -> T): List {
68 | val list = ArrayList(length())
69 | for (index in 0 until length()) {
70 | list.add(block(this, index))
71 | }
72 | return list
73 | }
74 | }
--------------------------------------------------------------------------------
/benchmark/src/main/java/com/jiang/json/benchmark/JSONReaderSerializer.kt:
--------------------------------------------------------------------------------
1 | package com.jiang.json.benchmark
2 |
3 | import android.util.JsonReader
4 | import java.io.InputStream
5 |
6 | class JSONReaderSerializer {
7 | fun parse(inputStream: InputStream): KRResponseDataClass {
8 | val reader = JsonReader(inputStream.bufferedReader())
9 | var users: List = emptyList()
10 | var status: String = ""
11 | var is_real_json: Boolean = false
12 | reader.beginObject()
13 | while (reader.hasNext()) {
14 | val name = reader.nextName()
15 | if (name.equals("status")) {
16 | status = reader.nextString()
17 | } else if (name.equals("is_real_json")) {
18 | is_real_json = reader.nextBoolean()
19 | } else if (name.equals("users")) {
20 | users = readUsers(reader)
21 | } else {
22 | reader.skipValue()
23 | }
24 | }
25 | reader.endObject()
26 | return KRResponseDataClass(users = users, status = status, is_real_json = is_real_json)
27 | }
28 |
29 | private fun readUsers(reader: JsonReader): List {
30 | val users = mutableListOf()
31 | reader.beginArray()
32 | while (reader.hasNext()) {
33 | users.add(readUser(reader))
34 | }
35 | reader.endArray()
36 | return users
37 | }
38 |
39 | private fun readUser(reader: JsonReader): KRUserDataClass {
40 | var _id = ""
41 | var index = 0
42 | var guid = ""
43 | var is_active = false
44 | var balance = ""
45 | var picture = ""
46 | var age = 0
47 | var name = KRNameDataClass(first = "", last = "")
48 | var company = ""
49 | var email = ""
50 | var address = ""
51 | var about = ""
52 | var registered = ""
53 | var latitude = 0.0
54 | var longitude = 0.0
55 | var tags = emptyList()
56 | var range = emptyList()
57 | var friends = emptyList()
58 | var images = emptyList()
59 | var greeting = ""
60 | var favorite_fruit = ""
61 | var eye_color = ""
62 | var phone = ""
63 | reader.beginObject()
64 | while (reader.hasNext()) {
65 | val keyName = reader.nextName()
66 | when (keyName) {
67 | "_id" -> _id = reader.nextString()
68 | "index" -> index = reader.nextInt()
69 | "guid" -> guid = reader.nextString()
70 | "is_active" -> is_active = reader.nextBoolean()
71 | "balance" -> balance = reader.nextString()
72 | "picture" -> picture = reader.nextString()
73 | "age" -> age = reader.nextInt()
74 | "name" -> name = readName(reader)
75 | "company" -> company = reader.nextString()
76 | "email" -> email = reader.nextString()
77 | "address" -> address = reader.nextString()
78 | "about" -> about = reader.nextString()
79 | "registered" -> registered = reader.nextString()
80 | "latitude" -> latitude = reader.nextDouble()
81 | "longitude" -> longitude = reader.nextDouble()
82 | "tags" -> tags = readTags(reader)
83 | "range" -> range = readRange(reader)
84 | "friends" -> friends = readFriends(reader)
85 | "images" -> images = readImages(reader)
86 | "greeting" -> greeting = reader.nextString()
87 | "favorite_fruit" -> favorite_fruit = reader.nextString()
88 | "eye_color" -> eye_color = reader.nextString()
89 | "phone" -> phone = reader.nextString()
90 | else -> reader.skipValue()
91 | }
92 | }
93 | reader.endObject()
94 | return KRUserDataClass(
95 | _id = _id,
96 | index = index,
97 | guid = guid,
98 | is_active = is_active,
99 | balance = balance,
100 | picture = picture,
101 | age = age,
102 | name = name,
103 | company = company,
104 | email = email,
105 | address = address,
106 | about = about,
107 | registered = registered,
108 | latitude = latitude,
109 | longitude = longitude,
110 | tags = tags,
111 | range = range,
112 | friends = friends,
113 | images = images,
114 | greeting = greeting,
115 | favorite_fruit = favorite_fruit,
116 | eye_color = eye_color,
117 | phone = phone
118 | )
119 | }
120 |
121 | private fun readTags(reader: JsonReader): List {
122 | val tags = mutableListOf()
123 | reader.beginArray()
124 | while (reader.hasNext()) {
125 | tags.add(reader.nextString())
126 | }
127 | reader.endArray()
128 | return tags
129 | }
130 |
131 | private fun readRange(reader: JsonReader): List {
132 | val range = mutableListOf()
133 | reader.beginArray()
134 | while (reader.hasNext()) {
135 | range.add(reader.nextInt())
136 | }
137 | reader.endArray()
138 | return range
139 | }
140 |
141 | private fun readName(reader: JsonReader): KRNameDataClass {
142 | var first = ""
143 | var last = ""
144 | reader.beginObject()
145 | while (reader.hasNext()) {
146 | val keyName = reader.nextName()
147 | when (keyName) {
148 | "first" -> first = reader.nextString()
149 | "last" -> last = reader.nextString()
150 | else -> reader.skipValue()
151 | }
152 | }
153 | reader.endObject()
154 | return KRNameDataClass(first = first, last = last)
155 | }
156 |
157 | private fun readFriends(reader: JsonReader): List {
158 | val friends = mutableListOf()
159 | reader.beginArray()
160 | while (reader.hasNext()) {
161 | friends.add(readFriend(reader))
162 | }
163 | reader.endArray()
164 | return friends
165 | }
166 |
167 | private fun readFriend(reader: JsonReader): KRFriendDataClass {
168 | var id = 0
169 | var name = ""
170 | reader.beginObject()
171 | while (reader.hasNext()) {
172 | val keyName = reader.nextName()
173 | when (keyName) {
174 | "id" -> id = reader.nextInt()
175 | "name" -> name = reader.nextString()
176 | else -> reader.skipValue()
177 | }
178 | }
179 | reader.endObject()
180 | return KRFriendDataClass(id = id, name = name)
181 | }
182 |
183 | private fun readImages(reader: JsonReader): List {
184 | val images = mutableListOf()
185 | reader.beginArray()
186 | while (reader.hasNext()) {
187 | images.add(readImage(reader))
188 | }
189 | reader.endArray()
190 | return images
191 | }
192 |
193 | private fun readImage(reader: JsonReader): KRImageDataClass {
194 | var id = ""
195 | var format = ""
196 | var url = ""
197 | var description = ""
198 | reader.beginObject()
199 | while (reader.hasNext()) {
200 | val keyName = reader.nextName()
201 | when (keyName) {
202 | "id" -> id = reader.nextString()
203 | "format" -> format = reader.nextString()
204 | "url" -> url = reader.nextString()
205 | "description" -> description = reader.nextString()
206 | else -> reader.skipValue()
207 | }
208 | }
209 | reader.endObject()
210 | return KRImageDataClass(id = id, format = format, url = url, description = description)
211 | }
212 | }
--------------------------------------------------------------------------------
/benchmark/src/main/java/com/jiang/json/benchmark/KSResponseModels.kt:
--------------------------------------------------------------------------------
1 | package com.jiang.json.benchmark
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 |
6 | @Serializable
7 | data class KSResponse(
8 | val users: List,
9 | val status: String,
10 | val is_real_json: Boolean
11 | )
12 |
13 | @Serializable
14 | data class KSUser(
15 | val _id: String,
16 | val index: Int,
17 | val guid: String,
18 | val is_active: Boolean,
19 | val balance: String,
20 | val picture: String,
21 | val age: Int,
22 | val name: KSName,
23 | val company: String,
24 | val email: String,
25 | val address: String,
26 | val about: String,
27 | val registered: String,
28 | val latitude: Double,
29 | val longitude: Double,
30 | val tags: List,
31 | val range: List,
32 | val friends: List,
33 | val images: List,
34 | val greeting: String,
35 | val favorite_fruit: String,
36 | val eye_color: String,
37 | val phone: String
38 | )
39 |
40 | @Serializable
41 | class KSName(
42 | val first: String,
43 | val last: String
44 | )
45 |
46 | @Serializable
47 | data class KSFriend(
48 | val id: Int,
49 | val name: String
50 | )
51 |
52 | @Serializable
53 | class KSImage(
54 | val id: String,
55 | val format: String,
56 | val url: String,
57 | val description: String
58 | )
--------------------------------------------------------------------------------
/benchmark/src/main/java/com/jiang/json/benchmark/KudosGsonResponseModels.kt:
--------------------------------------------------------------------------------
1 | package com.jiang.json.benchmark
2 |
3 | import com.kanyun.kudos.annotations.Kudos
4 | import com.kanyun.kudos.gson.KUDOS_GSON
5 |
6 | @Kudos(KUDOS_GSON)
7 | class KudosGsonResponse {
8 | var users: List? = null
9 | val status: String? = null
10 | val is_real_json: Boolean? = null
11 | }
12 |
13 | @Kudos(KUDOS_GSON)
14 | class KudosGsonUser {
15 | var _id: String? = null
16 | var index: Int? = null
17 | var guid: String? = null
18 | var is_active: Boolean? = null
19 | var balance: String? = null
20 | var picture: String? = null
21 | var age: Int? = null
22 | var name: KudosGsonName? = null
23 | var company: String? = null
24 | var email: String? = null
25 | var address: String? = null
26 | var about: String? = null
27 | var registered: String? = null
28 | var latitude: Double? = null
29 | var longitude: Double? = null
30 | var tags: List? = null
31 | var range: List? = null
32 | var friends: List? = null
33 | var images: List? = null
34 | var greeting: String? = null
35 | var favorite_fruit: String? = null
36 | var eye_color: String? = null
37 | var phone: String? = null
38 | }
39 |
40 | @Kudos(KUDOS_GSON)
41 | class KudosGsonName {
42 | var first: String? = null
43 | var last: String? = null
44 | }
45 |
46 | @Kudos(KUDOS_GSON)
47 | class KudosGsonFriend {
48 | var id: Int? = null
49 | var name: String? = null
50 | }
51 |
52 | @Kudos(KUDOS_GSON)
53 | class KudosGsonImage {
54 | var id: String? = null
55 | var format: String? = null
56 | var url: String? = null
57 | var description: String? = null
58 | }
--------------------------------------------------------------------------------
/benchmark/src/main/java/com/jiang/json/benchmark/KudosJacksonResponseModels.kt:
--------------------------------------------------------------------------------
1 | package com.jiang.json.benchmark
2 |
3 | import com.kanyun.kudos.annotations.Kudos
4 | import com.kanyun.kudos.gson.KUDOS_GSON
5 | import com.kanyun.kudos.jackson.KUDOS_JACKSON
6 |
7 | @Kudos(KUDOS_JACKSON)
8 | class KudosJacksonResponse {
9 | var users: List? = null
10 | val status: String? = null
11 | val is_real_json: Boolean? = null
12 | }
13 |
14 | @Kudos(KUDOS_JACKSON)
15 | class KudosJacksonUser {
16 | var _id: String? = null
17 | var index: Int? = null
18 | var guid: String? = null
19 | var is_active: Boolean? = null
20 | var balance: String? = null
21 | var picture: String? = null
22 | var age: Int? = null
23 | var name: KudosJacksonName? = null
24 | var company: String? = null
25 | var email: String? = null
26 | var address: String? = null
27 | var about: String? = null
28 | var registered: String? = null
29 | var latitude: Double? = null
30 | var longitude: Double? = null
31 | var tags: List? = null
32 | var range: List? = null
33 | var friends: List? = null
34 | var images: List? = null
35 | var greeting: String? = null
36 | var favorite_fruit: String? = null
37 | var eye_color: String? = null
38 | var phone: String? = null
39 | }
40 |
41 | @Kudos(KUDOS_JACKSON)
42 | class KudosJacksonName {
43 | var first: String? = null
44 | var last: String? = null
45 | }
46 |
47 | @Kudos(KUDOS_JACKSON)
48 | class KudosJacksonFriend {
49 | var id: Int? = null
50 | var name: String? = null
51 | }
52 |
53 | @Kudos(KUDOS_JACKSON)
54 | class KudosJacksonImage {
55 | var id: String? = null
56 | var format: String? = null
57 | var url: String? = null
58 | var description: String? = null
59 | }
--------------------------------------------------------------------------------
/benchmark/src/main/java/com/jiang/json/benchmark/KudosJsonReaderResponseModels.kt:
--------------------------------------------------------------------------------
1 | package com.jiang.json.benchmark
2 |
3 | import com.kanyun.kudos.annotations.Kudos
4 | import com.kanyun.kudos.gson.KUDOS_GSON
5 | import com.kanyun.kudos.json.reader.KUDOS_ANDROID_JSON_READER
6 |
7 | @Kudos(KUDOS_ANDROID_JSON_READER)
8 | class KudosJsonReaderResponse {
9 | var users: List? = null
10 | val status: String? = null
11 | val is_real_json: Boolean? = null
12 | }
13 |
14 | @Kudos(KUDOS_ANDROID_JSON_READER)
15 | class KudosJsonReaderUser {
16 | var _id: String? = null
17 | var index: Int? = null
18 | var guid: String? = null
19 | var is_active: Boolean? = null
20 | var balance: String? = null
21 | var picture: String? = null
22 | var age: Int? = null
23 | var name: KudosJsonReaderName? = null
24 | var company: String? = null
25 | var email: String? = null
26 | var address: String? = null
27 | var about: String? = null
28 | var registered: String? = null
29 | var latitude: Double? = null
30 | var longitude: Double? = null
31 | var tags: List? = null
32 | var range: List? = null
33 | var friends: List? = null
34 | var images: List? = null
35 | var greeting: String? = null
36 | var favorite_fruit: String? = null
37 | var eye_color: String? = null
38 | var phone: String? = null
39 | }
40 |
41 | @Kudos(KUDOS_ANDROID_JSON_READER)
42 | class KudosJsonReaderName {
43 | var first: String? = null
44 | var last: String? = null
45 | }
46 |
47 | @Kudos(KUDOS_ANDROID_JSON_READER)
48 | class KudosJsonReaderFriend {
49 | var id: Int? = null
50 | var name: String? = null
51 | }
52 |
53 | @Kudos(KUDOS_ANDROID_JSON_READER)
54 | class KudosJsonReaderImage {
55 | var id: String? = null
56 | var format: String? = null
57 | var url: String? = null
58 | var description: String? = null
59 | }
--------------------------------------------------------------------------------
/benchmark/src/main/java/com/jiang/json/benchmark/MoshiResponseModels.kt:
--------------------------------------------------------------------------------
1 | package com.jiang.json.benchmark
2 |
3 | import com.squareup.moshi.JsonClass
4 |
5 |
6 | @JsonClass(generateAdapter = true)
7 | data class MoshiKRResponse(
8 | val users: List,
9 | val status: String,
10 | val is_real_json: Boolean
11 | )
12 |
13 | @JsonClass(generateAdapter = true)
14 | data class MoshiKRUser(
15 | val _id: String,
16 | val index: Int,
17 | val guid: String,
18 | val is_active: Boolean,
19 | val balance: String,
20 | val picture: String,
21 | val age: Int,
22 | val name: MoshiKRName,
23 | val company: String,
24 | val email: String,
25 | val address: String,
26 | val about: String,
27 | val registered: String,
28 | val latitude: Double,
29 | val longitude: Double,
30 | val tags: List,
31 | val range: List,
32 | val friends: List,
33 | val images: List,
34 | val greeting: String,
35 | val favorite_fruit: String,
36 | val eye_color: String,
37 | val phone: String
38 | )
39 |
40 | @JsonClass(generateAdapter = true)
41 | class MoshiKRName(
42 | val first: String,
43 | val last: String
44 | )
45 |
46 | @JsonClass(generateAdapter = true)
47 | data class MoshiKRFriend(
48 | val id: Int,
49 | val name: String
50 | )
51 |
52 | @JsonClass(generateAdapter = true)
53 | class MoshiKRImage(
54 | val id: String,
55 | val format: String,
56 | val url: String,
57 | val description: String
58 | )
--------------------------------------------------------------------------------
/benchmark/src/main/java/com/jiang/json/benchmark/ResponseModels.kt:
--------------------------------------------------------------------------------
1 | package com.jiang.json.benchmark
2 |
3 |
4 | class KRResponse {
5 | var users: List? = null
6 | val status: String? = null
7 | val is_real_json: Boolean? = null
8 | }
9 |
10 | class KRUser {
11 | var _id: String? = null
12 | var index: Int? = null
13 | var guid: String? = null
14 | var is_active: Boolean? = null
15 | var balance: String? = null
16 | var picture: String? = null
17 | var age: Int? = null
18 | var name: KRName? = null
19 | var company: String? = null
20 | var email: String? = null
21 | var address: String? = null
22 | var about: String? = null
23 | var registered: String? = null
24 | var latitude: Double? = null
25 | var longitude: Double? = null
26 | var tags: List? = null
27 | var range: List? = null
28 | var friends: List? = null
29 | var images: List? = null
30 | var greeting: String? = null
31 | var favorite_fruit: String? = null
32 | var eye_color: String? = null
33 | var phone: String? = null
34 | }
35 |
36 | class KRName {
37 | var first: String? = null
38 | var last: String? = null
39 | }
40 |
41 | class KRFriend {
42 | var id: Int? = null
43 | var name: String? = null
44 | }
45 |
46 | class KRImage {
47 | var id: String? = null
48 | var format: String? = null
49 | var url: String? = null
50 | var description: String? = null
51 | }
--------------------------------------------------------------------------------
/benchmark/src/main/proto/SomeMessage.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto3";
2 |
3 | message SomeMessage {
4 |
5 | message Name {
6 | string first = 1;
7 | string last = 2;
8 | }
9 |
10 | message Friends {
11 | uint32 id = 1;
12 | string name = 2;
13 | }
14 |
15 | message Images {
16 | string id = 1;
17 | string format = 2;
18 | string url = 3;
19 | string description = 4;
20 | }
21 |
22 | message Users {
23 | string _id = 1;
24 | uint32 index = 2;
25 | string guid = 3;
26 | bool is_active = 4;
27 | string balance = 5;
28 | string picture = 6;
29 | uint32 age = 7;
30 | string eye_color = 8;
31 | Name name = 9;
32 | string company = 10;
33 | string email = 11;
34 | string phone = 12;
35 | string address = 13;
36 | string about = 14;
37 | string registered = 15;
38 | double latitude = 16;
39 | double longitude = 17;
40 | repeated string tags = 18;
41 | repeated uint32 range = 19;
42 | repeated Friends friends = 20;
43 | repeated Images images = 21;
44 | string greeting = 22;
45 | string favorite_fruit = 23;
46 | }
47 |
48 | repeated Users users = 1;
49 | string status = 2;
50 | bool is_real_json = 3;
51 | }
--------------------------------------------------------------------------------
/benchmark/src/main/resources/large.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RicardoJiang/json-benchmark/61d5664445f3fe5f5bf16e695454a482e00b98e6/benchmark/src/main/resources/large.bin
--------------------------------------------------------------------------------
/benchmark/src/main/resources/medium.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RicardoJiang/json-benchmark/61d5664445f3fe5f5bf16e695454a482e00b98e6/benchmark/src/main/resources/medium.bin
--------------------------------------------------------------------------------
/benchmark/src/main/resources/medium.json:
--------------------------------------------------------------------------------
1 | {
2 | "users": [
3 | {
4 | "_id": "54e1a204a9fdb3ecc2492728",
5 | "index": 0,
6 | "guid": "fc13e42c-1285-435c-beea-f978bdeb808e",
7 | "is_active": false,
8 | "balance": "$2,266.76",
9 | "picture": "http://placehold.it/32x32",
10 | "age": 40,
11 | "eye_color": "green",
12 | "name": {
13 | "first": "Elise",
14 | "last": "Lopez"
15 | },
16 | "company": "DATACATOR",
17 | "email": "elise.lopez@datacator.net",
18 | "phone": "+1 (881) 409-2092",
19 | "address": "191 Ditmars Street, Imperial, New Jersey, 6880",
20 | "about": "Incididunt esse laborum labore occaecat ea officia dolore proident consectetur elit ut exercitation. Et adipisicing id ad consectetur aute aliquip consequat fugiat cupidatat velit labore veniam. Eu consequat culpa nisi esse aute exercitation culpa et aliquip dolore aute reprehenderit irure. Magna aliquip adipisicing qui aute. Sunt aliquip excepteur exercitation occaecat. Ad veniam et reprehenderit culpa tempor culpa Lorem proident aliquip deserunt consectetur. Pariatur est dolore esse aliquip tempor quis culpa eiusmod consequat laborum minim nisi.\r\n",
21 | "registered": "Wednesday, April 23, 2014 3:46 PM",
22 | "latitude": 0.561726,
23 | "longitude": -161.91028,
24 | "tags": [
25 | "adipisicing",
26 | "officia",
27 | "excepteur",
28 | "esse",
29 | "nisi",
30 | "mollit",
31 | "eu"
32 | ],
33 | "range": [
34 | 0,
35 | 1,
36 | 2,
37 | 3,
38 | 4,
39 | 5,
40 | 6,
41 | 7,
42 | 8,
43 | 9
44 | ],
45 | "friends": [
46 | {
47 | "id": 0,
48 | "name": "Burt Norman"
49 | },
50 | {
51 | "id": 1,
52 | "name": "Marcella Bartlett"
53 | },
54 | {
55 | "id": 2,
56 | "name": "Ebony Mcbride"
57 | }
58 | ],
59 | "images": [
60 | {
61 | "id": "54e1a2040e8cff91ca7d4a5f",
62 | "format": "",
63 | "url": "http://ourimageserver/efb9dbd8-77d1-4cfe-8faa-7b6903abddd3",
64 | "description": "Excepteur labore eu pariatur nulla sunt laboris laboris ad adipisicing aute dolor sit occaecat enim."
65 | },
66 | {
67 | "id": "54e1a204d0519d912d762e4c",
68 | "format": "",
69 | "url": "http://ourimageserver/c90ee399-224f-42c1-a9bc-d61ffa0e0d1e",
70 | "description": "Occaecat cillum cillum aliquip incididunt in velit nulla nulla minim."
71 | },
72 | {
73 | "id": "54e1a20466caebfebf189778",
74 | "format": "",
75 | "url": "http://ourimageserver/df63765c-f895-4786-bbdd-afd0b0e0280d",
76 | "description": "Id id et elit ad commodo ipsum consectetur aliqua ea exercitation ex cillum."
77 | },
78 | {
79 | "id": "54e1a204ef1bee1b78e4018d",
80 | "format": "",
81 | "url": "http://ourimageserver/8cc522b6-32d2-47b3-901a-41a0255b1f88",
82 | "description": "Esse ullamco et voluptate et incididunt dolor mollit fugiat id ipsum."
83 | },
84 | {
85 | "id": "54e1a2043feb3c2b509c9c12",
86 | "format": "",
87 | "url": "http://ourimageserver/a1822162-7a58-4484-88b8-0ecefeee8d80",
88 | "description": "Aute voluptate elit duis ipsum est exercitation esse ea dolore qui aliqua ut consectetur."
89 | }
90 | ],
91 | "greeting": "Hello, Elise! You have 7 unread messages.",
92 | "favorite_fruit": "strawberry"
93 | },
94 | {
95 | "_id": "54e1a2041d041012d109e0c2",
96 | "index": 1,
97 | "guid": "54986b4b-1ea0-4e05-98d8-4c874b4d06dd",
98 | "is_active": true,
99 | "balance": "$3,668.07",
100 | "picture": "http://placehold.it/32x32",
101 | "age": 26,
102 | "eye_color": "blue",
103 | "name": {
104 | "first": "Lois",
105 | "last": "Griffin"
106 | },
107 | "company": "SOLGAN",
108 | "email": "lois.griffin@solgan.info",
109 | "phone": "+1 (899) 543-3181",
110 | "address": "539 Willoughby Avenue, Brady, Rhode Island, 8212",
111 | "about": "Minim non et et id dolore anim ea in nisi excepteur cillum qui Lorem. Tempor dolore voluptate voluptate qui exercitation proident. Mollit fugiat veniam dolore sit aliquip eu aute occaecat proident pariatur aliquip do id.\r\n",
112 | "registered": "Thursday, March 6, 2014 7:30 PM",
113 | "latitude": -48.87311,
114 | "longitude": -16.098083,
115 | "tags": [
116 | "aute",
117 | "incididunt",
118 | "veniam",
119 | "aute",
120 | "reprehenderit",
121 | "incididunt",
122 | "excepteur"
123 | ],
124 | "range": [
125 | 0,
126 | 1,
127 | 2,
128 | 3,
129 | 4,
130 | 5,
131 | 6,
132 | 7,
133 | 8,
134 | 9
135 | ],
136 | "friends": [
137 | {
138 | "id": 0,
139 | "name": "Tamara Daniel"
140 | },
141 | {
142 | "id": 1,
143 | "name": "Richards Andrews"
144 | },
145 | {
146 | "id": 2,
147 | "name": "Tate Sloan"
148 | }
149 | ],
150 | "images": [
151 | {
152 | "id": "54e1a2044ecac58ecb25bb41",
153 | "format": "",
154 | "url": "http://ourimageserver/b28b839b-37c7-46cb-b79b-227320cd6e09",
155 | "description": "Ullamco reprehenderit irure occaecat nulla nostrud."
156 | },
157 | {
158 | "id": "54e1a204d863eb67fb966abe",
159 | "format": "",
160 | "url": "http://ourimageserver/8af148cc-556f-4257-9198-cdec3fc5eeb1",
161 | "description": "Est amet reprehenderit sunt aute pariatur excepteur nisi cillum ipsum velit ea magna tempor ipsum."
162 | },
163 | {
164 | "id": "54e1a2046dde891b23ef65df",
165 | "format": "",
166 | "url": "http://ourimageserver/b5e2d293-7359-425c-a0f4-c03d0aa80f47",
167 | "description": "Mollit tempor nulla eu pariatur ipsum ipsum do mollit aliquip exercitation ex et."
168 | },
169 | {
170 | "id": "54e1a204d66089670f6621be",
171 | "format": "",
172 | "url": "http://ourimageserver/73bdd75e-b320-4177-8978-d6c2ba686515",
173 | "description": "Id proident aliqua incididunt laborum velit officia."
174 | },
175 | {
176 | "id": "54e1a204f2160ae9562f4ce6",
177 | "format": "",
178 | "url": "http://ourimageserver/30e33458-4e5b-4afb-90aa-011652bd88ff",
179 | "description": "Veniam exercitation voluptate enim pariatur ipsum exercitation sit consectetur sit esse aute anim."
180 | },
181 | {
182 | "id": "54e1a204ed9db05e269f5090",
183 | "format": "",
184 | "url": "http://ourimageserver/10148dcf-11df-4cea-8ebc-6e796161c284",
185 | "description": "Nostrud laborum exercitation cillum Lorem eu consequat in Lorem."
186 | },
187 | {
188 | "id": "54e1a204f0ffc804f3ccb8cf",
189 | "format": "",
190 | "url": "http://ourimageserver/4c5bf78a-d453-4d2f-a4a1-f21a0c7879fb",
191 | "description": "Veniam commodo do est reprehenderit."
192 | },
193 | {
194 | "id": "54e1a2046b3d3ee96537c00b",
195 | "format": "",
196 | "url": "http://ourimageserver/d52833f6-81c7-426f-833f-4f3d99309a69",
197 | "description": "Reprehenderit pariatur consectetur Lorem ex esse ea proident veniam nostrud nulla fugiat sit exercitation."
198 | },
199 | {
200 | "id": "54e1a204141be794f5e756a4",
201 | "format": "",
202 | "url": "http://ourimageserver/bf658684-07f5-442b-8067-8851c44b499e",
203 | "description": "Consequat do ex eiusmod voluptate proident labore ea."
204 | },
205 | {
206 | "id": "54e1a2042b9dc014673002b3",
207 | "format": "",
208 | "url": "http://ourimageserver/a887f516-9384-4e5a-b956-e250afd68885",
209 | "description": "Pariatur reprehenderit incididunt consequat officia cupidatat consequat."
210 | }
211 | ],
212 | "greeting": "Hello, Lois! You have 10 unread messages.",
213 | "favorite_fruit": "apple"
214 | },
215 | {
216 | "_id": "54e1a2040e09e4cbf19615a8",
217 | "index": 2,
218 | "guid": "6f9d5496-5f5c-4105-ab20-6f858fb6bdf1",
219 | "is_active": false,
220 | "balance": "$3,604.93",
221 | "picture": "http://placehold.it/32x32",
222 | "age": 33,
223 | "eye_color": "brown",
224 | "name": {
225 | "first": "Arnold",
226 | "last": "Avery"
227 | },
228 | "company": "ZBOO",
229 | "email": "arnold.avery@zboo.org",
230 | "phone": "+1 (868) 584-2085",
231 | "address": "169 Laurel Avenue, Marshall, Vermont, 7640",
232 | "about": "Fugiat non veniam minim cupidatat sunt culpa. Mollit amet non ad cillum laborum veniam in eiusmod. Sit non ad consequat labore. Laborum anim nostrud id aute. Do sunt sint reprehenderit ex anim minim dolore aliqua veniam.\r\n",
233 | "registered": "Thursday, October 30, 2014 9:47 AM",
234 | "latitude": 26.089997,
235 | "longitude": 74.588284,
236 | "tags": [
237 | "non",
238 | "veniam",
239 | "laboris",
240 | "dolor",
241 | "fugiat",
242 | "velit",
243 | "nulla"
244 | ],
245 | "range": [
246 | 0,
247 | 1,
248 | 2,
249 | 3,
250 | 4,
251 | 5,
252 | 6,
253 | 7,
254 | 8,
255 | 9
256 | ],
257 | "friends": [
258 | {
259 | "id": 0,
260 | "name": "Valentine Klein"
261 | },
262 | {
263 | "id": 1,
264 | "name": "Sheree Dodson"
265 | },
266 | {
267 | "id": 2,
268 | "name": "Autumn Wiggins"
269 | }
270 | ],
271 | "images": [
272 | {
273 | "id": "54e1a2045bf2d23879956c11",
274 | "format": "",
275 | "url": "http://ourimageserver/ddffecf2-ccdf-4bd0-bc1e-84a664b61e70",
276 | "description": "Velit exercitation sit ullamco ea veniam aute eu ipsum."
277 | },
278 | {
279 | "id": "54e1a204972f07fdb48c4729",
280 | "format": "",
281 | "url": "http://ourimageserver/d1c06e32-02bf-4f94-9c21-ce081d34cfd0",
282 | "description": "Esse qui qui sint mollit deserunt ex nostrud velit irure fugiat non esse voluptate."
283 | },
284 | {
285 | "id": "54e1a2040ce5771e5b0e5137",
286 | "format": "",
287 | "url": "http://ourimageserver/e1496482-a271-4b4e-8ea8-a1f1d183b3b6",
288 | "description": "Duis consequat incididunt officia incididunt."
289 | },
290 | {
291 | "id": "54e1a204731db2668c4ef3c0",
292 | "format": "",
293 | "url": "http://ourimageserver/6d876e66-c30e-4635-931e-fe9612909a2a",
294 | "description": "Labore commodo dolor officia amet Lorem nulla commodo anim dolor aliqua sit adipisicing est."
295 | }
296 | ],
297 | "greeting": "Hello, Arnold! You have 6 unread messages.",
298 | "favorite_fruit": "apple"
299 | },
300 | {
301 | "_id": "54e1a20464becc31b70cafb5",
302 | "index": 3,
303 | "guid": "c0965c65-0cfe-471c-900c-3e4a1b9f9048",
304 | "is_active": false,
305 | "balance": "$3,820.30",
306 | "picture": "http://placehold.it/32x32",
307 | "age": 21,
308 | "eye_color": "blue",
309 | "name": {
310 | "first": "Morris",
311 | "last": "Kinney"
312 | },
313 | "company": "XYQAG",
314 | "email": "morris.kinney@xyqag.ca",
315 | "phone": "+1 (861) 556-3834",
316 | "address": "782 Lafayette Avenue, Caledonia, Delaware, 7030",
317 | "about": "In nisi in eu do magna nostrud labore esse qui deserunt. Aliqua id officia proident cupidatat sint sint sit voluptate eiusmod consectetur laboris. Occaecat ut consectetur elit in non quis Lorem mollit officia. Aute occaecat occaecat elit nisi mollit aliquip fugiat culpa laborum aute. Ullamco aliquip eiusmod laborum elit aute dolor officia eiusmod culpa. Deserunt do consequat sit cillum eiusmod anim. Qui ea minim elit amet anim culpa occaecat ullamco ea pariatur.\r\n",
318 | "registered": "Thursday, January 2, 2014 7:26 AM",
319 | "latitude": 27.771269,
320 | "longitude": 22.154834,
321 | "tags": [
322 | "officia",
323 | "enim",
324 | "sunt",
325 | "aliqua",
326 | "qui",
327 | "magna",
328 | "minim"
329 | ],
330 | "range": [
331 | 0,
332 | 1,
333 | 2,
334 | 3,
335 | 4,
336 | 5,
337 | 6,
338 | 7,
339 | 8,
340 | 9
341 | ],
342 | "friends": [
343 | {
344 | "id": 0,
345 | "name": "Marylou Gonzales"
346 | },
347 | {
348 | "id": 1,
349 | "name": "Cherie Berry"
350 | },
351 | {
352 | "id": 2,
353 | "name": "Randolph Donovan"
354 | }
355 | ],
356 | "images": [
357 | {
358 | "id": "54e1a2049b68b72b659adc64",
359 | "format": "",
360 | "url": "http://ourimageserver/39f521ed-ad0f-4b3f-b6f1-137b56c07c87",
361 | "description": "Do nisi in tempor tempor ea mollit do cillum laborum culpa proident."
362 | },
363 | {
364 | "id": "54e1a204447447828085d5b4",
365 | "format": "",
366 | "url": "http://ourimageserver/7f96afb0-2bf8-465f-a7b6-57c5d04387ae",
367 | "description": "Esse incididunt fugiat velit cupidatat esse mollit."
368 | },
369 | {
370 | "id": "54e1a204d8ac147cffb67c2e",
371 | "format": "",
372 | "url": "http://ourimageserver/9dd72b9f-0931-4bb1-8896-02ea2f3f6bdf",
373 | "description": "Sit aliqua pariatur et cillum."
374 | },
375 | {
376 | "id": "54e1a2049fc91ac0d2042103",
377 | "format": "",
378 | "url": "http://ourimageserver/410d469c-d824-47ca-a2c0-7445ca088bff",
379 | "description": "Dolor fugiat laboris ea pariatur ut ea quis nisi occaecat incididunt."
380 | },
381 | {
382 | "id": "54e1a20447300e29cc0d3dc4",
383 | "format": "",
384 | "url": "http://ourimageserver/82cd371b-e83f-4fff-afe9-5ce88dfa05fc",
385 | "description": "Proident dolor amet amet ut consectetur proident sunt proident occaecat in elit irure anim."
386 | },
387 | {
388 | "id": "54e1a2045f5b719bae06a546",
389 | "format": "",
390 | "url": "http://ourimageserver/898d969b-cfbf-4fb8-bfb8-c153fc7794df",
391 | "description": "Est tempor eu culpa mollit in voluptate consequat qui ad ad est."
392 | },
393 | {
394 | "id": "54e1a2045e5739b92dbfd4a9",
395 | "format": "",
396 | "url": "http://ourimageserver/c4068c56-9559-4c03-92e9-d1f15eee9776",
397 | "description": "Cupidatat ut et proident mollit ea deserunt."
398 | },
399 | {
400 | "id": "54e1a2049a180cf3cd884fb0",
401 | "format": "",
402 | "url": "http://ourimageserver/d8b926b1-dbc0-45b3-bad1-2ad499139b67",
403 | "description": "Veniam mollit Lorem id ad."
404 | },
405 | {
406 | "id": "54e1a2049b148f7763db6ef0",
407 | "format": "",
408 | "url": "http://ourimageserver/ea3009b8-4435-4709-bf52-30bfa384d4fe",
409 | "description": "Nostrud culpa enim esse eu laboris sunt."
410 | },
411 | {
412 | "id": "54e1a204027b2e373459665a",
413 | "format": "",
414 | "url": "http://ourimageserver/435efabb-2ca0-4f33-a02e-0062c96fa304",
415 | "description": "Reprehenderit exercitation sint commodo voluptate magna ea aute dolor tempor dolore elit sint duis."
416 | },
417 | {
418 | "id": "54e1a204bec9106702efe591",
419 | "format": "",
420 | "url": "http://ourimageserver/0d873bb6-2b52-498a-a2b8-32ff8cd1da48",
421 | "description": "Veniam sit elit reprehenderit adipisicing."
422 | },
423 | {
424 | "id": "54e1a204a7af266f9fa11e3e",
425 | "format": "",
426 | "url": "http://ourimageserver/9f3ee0a0-6940-42c8-a323-e282b104f4af",
427 | "description": "Nisi id cupidatat reprehenderit voluptate ipsum consequat dolor eiusmod cillum voluptate commodo qui anim id."
428 | }
429 | ],
430 | "greeting": "Hello, Morris! You have 5 unread messages.",
431 | "favorite_fruit": "banana"
432 | },
433 | {
434 | "_id": "54e1a2046cd145888dee19ac",
435 | "index": 4,
436 | "guid": "993d48ab-d2e7-46ed-ba4f-ccaa8162e803",
437 | "is_active": true,
438 | "balance": "$2,208.24",
439 | "picture": "http://placehold.it/32x32",
440 | "age": 35,
441 | "eye_color": "green",
442 | "name": {
443 | "first": "Mcneil",
444 | "last": "Boyd"
445 | },
446 | "company": "PROTODYNE",
447 | "email": "mcneil.boyd@protodyne.co.uk",
448 | "phone": "+1 (853) 502-2770",
449 | "address": "359 Bergen Street, Grahamtown, West Virginia, 5496",
450 | "about": "Quis dolore proident quis sit sunt ullamco tempor tempor dolor. Cillum voluptate proident ad est aliquip. Quis aliqua eu velit qui. Nisi ut dolore ullamco ea sit. Sint irure eiusmod excepteur aliquip elit. Labore quis est ea qui magna occaecat. Ullamco excepteur anim excepteur adipisicing ex do enim Lorem ullamco veniam sunt Lorem.\r\n",
451 | "registered": "Friday, May 30, 2014 12:34 PM",
452 | "latitude": -23.533614,
453 | "longitude": -140.484897,
454 | "tags": [
455 | "fugiat",
456 | "nisi",
457 | "do",
458 | "adipisicing",
459 | "consectetur",
460 | "excepteur",
461 | "incididunt"
462 | ],
463 | "range": [
464 | 0,
465 | 1,
466 | 2,
467 | 3,
468 | 4,
469 | 5,
470 | 6,
471 | 7,
472 | 8,
473 | 9
474 | ],
475 | "friends": [
476 | {
477 | "id": 0,
478 | "name": "Robinson Delaney"
479 | },
480 | {
481 | "id": 1,
482 | "name": "Alvarado Madden"
483 | },
484 | {
485 | "id": 2,
486 | "name": "Harriett Bell"
487 | }
488 | ],
489 | "images": [
490 | {
491 | "id": "54e1a2043fadc2d71d421b09",
492 | "format": "",
493 | "url": "http://ourimageserver/0a7b6fb3-b53a-4721-a4ce-fa41d4f83d02",
494 | "description": "Consectetur ex aliquip sunt cupidatat tempor excepteur dolore velit commodo laboris commodo aute."
495 | },
496 | {
497 | "id": "54e1a204b69cd4d34ce4147e",
498 | "format": "",
499 | "url": "http://ourimageserver/a4002182-54c5-4a2d-973e-8b8428df0c40",
500 | "description": "Lorem anim ullamco id esse aute commodo commodo mollit est ipsum nisi irure ex."
501 | },
502 | {
503 | "id": "54e1a2042b124ad18645cc09",
504 | "format": "",
505 | "url": "http://ourimageserver/32176e3f-6320-4c53-a204-7d809f4436ab",
506 | "description": "Est veniam irure nulla ut."
507 | },
508 | {
509 | "id": "54e1a20430f7b2c0f5fad872",
510 | "format": "",
511 | "url": "http://ourimageserver/2c28c69c-6201-4417-8df1-dbfa89ee863e",
512 | "description": "Labore minim eu exercitation consequat."
513 | },
514 | {
515 | "id": "54e1a204a69c9fa81f6e1e1e",
516 | "format": "",
517 | "url": "http://ourimageserver/4712ea55-e874-4110-a89a-e13b698eff7b",
518 | "description": "Adipisicing ipsum exercitation amet magna nostrud et ullamco exercitation in qui quis ullamco elit."
519 | },
520 | {
521 | "id": "54e1a2041000fbe80ee66b08",
522 | "format": "",
523 | "url": "http://ourimageserver/fbf70d12-f2d5-4495-a3d6-4163d0dc3368",
524 | "description": "Pariatur cillum esse ipsum voluptate aliquip ut."
525 | },
526 | {
527 | "id": "54e1a204ca2aaeaffa59ec47",
528 | "format": "",
529 | "url": "http://ourimageserver/fe07138b-f49e-4f7d-88f2-70b71cf92983",
530 | "description": "Reprehenderit nisi minim occaecat irure amet veniam et irure duis ea voluptate pariatur minim."
531 | },
532 | {
533 | "id": "54e1a20475d7818c7b2afaf7",
534 | "format": "",
535 | "url": "http://ourimageserver/af36f7bb-4e65-4823-9b3d-fb65bce44a81",
536 | "description": "Culpa aliquip sint ipsum aliquip aute aute quis labore voluptate voluptate adipisicing incididunt."
537 | },
538 | {
539 | "id": "54e1a204fe2262217cc24156",
540 | "format": "",
541 | "url": "http://ourimageserver/b956577a-0ce0-480f-acfb-5c642e7cdd1b",
542 | "description": "Magna sunt ullamco aute est tempor cillum reprehenderit officia sunt ullamco id."
543 | }
544 | ],
545 | "greeting": "Hello, Mcneil! You have 6 unread messages.",
546 | "favorite_fruit": "banana"
547 | },
548 | {
549 | "_id": "54e1a2049be46a9e27462f2f",
550 | "index": 5,
551 | "guid": "3bfbd0ae-fde5-4467-a3cb-2c8be1b624f7",
552 | "is_active": true,
553 | "balance": "$1,521.07",
554 | "picture": "http://placehold.it/32x32",
555 | "age": 28,
556 | "eye_color": "green",
557 | "name": {
558 | "first": "Martina",
559 | "last": "Patton"
560 | },
561 | "company": "KEGULAR",
562 | "email": "martina.patton@kegular.biz",
563 | "phone": "+1 (964) 413-2035",
564 | "address": "615 Columbia Place, Harleigh, Northern Mariana Islands, 4162",
565 | "about": "Quis commodo sunt velit nostrud. Enim ut ipsum magna esse ad occaecat aliquip. Cillum enim ipsum exercitation velit dolor tempor tempor. Ea dolor duis enim occaecat ipsum non minim tempor nostrud. Velit nisi fugiat elit in aute et culpa magna non ex Lorem. Tempor aliquip fugiat occaecat ad occaecat aliqua non sunt.\r\n",
566 | "registered": "Monday, January 6, 2014 11:24 AM",
567 | "latitude": 33.883821,
568 | "longitude": -148.735935,
569 | "tags": [
570 | "deserunt",
571 | "proident",
572 | "ad",
573 | "laborum",
574 | "id",
575 | "exercitation",
576 | "tempor"
577 | ],
578 | "range": [
579 | 0,
580 | 1,
581 | 2,
582 | 3,
583 | 4,
584 | 5,
585 | 6,
586 | 7,
587 | 8,
588 | 9
589 | ],
590 | "friends": [
591 | {
592 | "id": 0,
593 | "name": "Burks Barr"
594 | },
595 | {
596 | "id": 1,
597 | "name": "Drake Long"
598 | },
599 | {
600 | "id": 2,
601 | "name": "Mari Ochoa"
602 | }
603 | ],
604 | "images": [
605 | {
606 | "id": "54e1a204148a95ee3dabb1c2",
607 | "format": "",
608 | "url": "http://ourimageserver/7c3804a2-ce08-44ef-976d-502df44add9d",
609 | "description": "Nisi ut ipsum anim quis excepteur aute excepteur pariatur velit sunt occaecat aute commodo proident."
610 | },
611 | {
612 | "id": "54e1a204566e3047b98a1bc4",
613 | "format": "",
614 | "url": "http://ourimageserver/daf24602-c166-41c0-b730-f9d5c14d4d8b",
615 | "description": "Magna anim cupidatat veniam fugiat laborum."
616 | },
617 | {
618 | "id": "54e1a204ec98a562d6c4c9a3",
619 | "format": "",
620 | "url": "http://ourimageserver/61a078d8-ea35-4486-8ecc-90fd7a957b6d",
621 | "description": "Est sint adipisicing deserunt fugiat exercitation."
622 | },
623 | {
624 | "id": "54e1a204d130afa03bb453bf",
625 | "format": "",
626 | "url": "http://ourimageserver/252238ae-58c4-4687-9931-f1dee979f98a",
627 | "description": "Ut non sunt deserunt est dolore commodo irure non."
628 | },
629 | {
630 | "id": "54e1a204e6b0d68678a4bb3d",
631 | "format": "",
632 | "url": "http://ourimageserver/c0b2f50c-548a-434b-ae4c-68086b42b2cf",
633 | "description": "Dolore adipisicing minim labore reprehenderit anim tempor nisi veniam anim dolor ullamco anim excepteur."
634 | },
635 | {
636 | "id": "54e1a20461b3f020e0e8c280",
637 | "format": "",
638 | "url": "http://ourimageserver/1d3f9a77-43d7-4289-9884-a1edbee09b07",
639 | "description": "Elit et duis et Lorem quis occaecat pariatur minim culpa ex commodo eu."
640 | },
641 | {
642 | "id": "54e1a20400c2d60a6470ea7f",
643 | "format": "",
644 | "url": "http://ourimageserver/d59450bb-c947-4d70-a9d3-3dbd8f453c03",
645 | "description": "Anim ipsum incididunt adipisicing pariatur id sunt."
646 | },
647 | {
648 | "id": "54e1a204c3521b0450149638",
649 | "format": "",
650 | "url": "http://ourimageserver/03b6876f-353c-486f-ab01-8d55a90efbd6",
651 | "description": "Aliqua excepteur adipisicing tempor culpa reprehenderit in ut sint velit dolore culpa dolore."
652 | },
653 | {
654 | "id": "54e1a204622a067e04bf6fe3",
655 | "format": "",
656 | "url": "http://ourimageserver/76747277-cd82-4c95-a50f-25e104ff9f24",
657 | "description": "Irure elit anim nulla ea ex adipisicing nisi consequat enim."
658 | },
659 | {
660 | "id": "54e1a2040e3cd6cf355b3bfd",
661 | "format": "",
662 | "url": "http://ourimageserver/da25bc44-e531-47c3-97a3-aab40be464a9",
663 | "description": "Nulla est excepteur irure eiusmod."
664 | },
665 | {
666 | "id": "54e1a204b01f9703a0c0c369",
667 | "format": "",
668 | "url": "http://ourimageserver/ee44b0f0-4351-4a70-a783-5fdf7a822ee5",
669 | "description": "Non do duis dolore et ea ullamco."
670 | }
671 | ],
672 | "greeting": "Hello, Martina! You have 7 unread messages.",
673 | "favorite_fruit": "apple"
674 | },
675 | {
676 | "_id": "54e1a2040254583a00e8a0ad",
677 | "index": 6,
678 | "guid": "9b976786-9bbf-4fca-9577-bc9bbc781403",
679 | "is_active": false,
680 | "balance": "$2,825.62",
681 | "picture": "http://placehold.it/32x32",
682 | "age": 27,
683 | "eye_color": "blue",
684 | "name": {
685 | "first": "Flossie",
686 | "last": "Warren"
687 | },
688 | "company": "VIDTO",
689 | "email": "flossie.warren@vidto.me",
690 | "phone": "+1 (868) 526-2416",
691 | "address": "423 Junius Street, Albrightsville, New York, 2726",
692 | "about": "Veniam in voluptate eiusmod labore duis adipisicing qui pariatur tempor. Occaecat pariatur ut sunt ad aliqua aliqua. Ea mollit enim sint voluptate. Reprehenderit eu reprehenderit deserunt qui id laborum occaecat eu veniam dolor esse cillum consectetur. Amet esse eu ad elit minim eu anim sunt fugiat adipisicing consequat.\r\n",
693 | "registered": "Thursday, April 17, 2014 1:34 AM",
694 | "latitude": -49.961415,
695 | "longitude": 4.090035,
696 | "tags": [
697 | "laborum",
698 | "ex",
699 | "est",
700 | "aliqua",
701 | "Lorem",
702 | "laborum",
703 | "laborum"
704 | ],
705 | "range": [
706 | 0,
707 | 1,
708 | 2,
709 | 3,
710 | 4,
711 | 5,
712 | 6,
713 | 7,
714 | 8,
715 | 9
716 | ],
717 | "friends": [
718 | {
719 | "id": 0,
720 | "name": "Dixon Patel"
721 | },
722 | {
723 | "id": 1,
724 | "name": "Iva Lane"
725 | },
726 | {
727 | "id": 2,
728 | "name": "Teresa Franks"
729 | }
730 | ],
731 | "images": [
732 | {
733 | "id": "54e1a2040191df2403ad3ebf",
734 | "format": "",
735 | "url": "http://ourimageserver/73cf327d-e7b3-473a-98bd-4f4b9d26a14b",
736 | "description": "Minim pariatur consequat labore do adipisicing dolore exercitation amet ut deserunt qui Lorem magna."
737 | },
738 | {
739 | "id": "54e1a20421f8556886bc3b6f",
740 | "format": "",
741 | "url": "http://ourimageserver/5caad5af-c88d-4530-a182-e49acdde8971",
742 | "description": "Eiusmod minim sunt ipsum anim fugiat Lorem cillum do magna cupidatat."
743 | },
744 | {
745 | "id": "54e1a20458ec92953c784d28",
746 | "format": "",
747 | "url": "http://ourimageserver/864d6fe8-a7cf-4940-87ab-20607da97447",
748 | "description": "Duis qui in ullamco nostrud nisi deserunt anim cillum deserunt."
749 | },
750 | {
751 | "id": "54e1a204d387c66ba9794ad9",
752 | "format": "",
753 | "url": "http://ourimageserver/d7e388af-b848-49f4-bd1d-ff3884a9834f",
754 | "description": "Incididunt ipsum occaecat nisi dolore do tempor."
755 | },
756 | {
757 | "id": "54e1a204202a7495f6a0da31",
758 | "format": "",
759 | "url": "http://ourimageserver/e60281a6-332e-4406-89b2-a9e788d110da",
760 | "description": "Deserunt labore nisi magna do nulla nisi aute cupidatat proident ad occaecat."
761 | },
762 | {
763 | "id": "54e1a204787e0e30d0e35ce4",
764 | "format": "",
765 | "url": "http://ourimageserver/2b934243-82b9-4a8b-ad7d-01dab7559435",
766 | "description": "Esse quis nulla ad et do amet."
767 | },
768 | {
769 | "id": "54e1a20455fb4de89981cd46",
770 | "format": "",
771 | "url": "http://ourimageserver/cca71c5b-c2bb-44c0-8796-6650b1e99f6b",
772 | "description": "Amet anim minim commodo sint ea aute proident aliquip consectetur excepteur non nulla."
773 | },
774 | {
775 | "id": "54e1a20434b1e6b591c5e366",
776 | "format": "",
777 | "url": "http://ourimageserver/36de445f-23a2-47fb-89d8-8dd0d7ff83c0",
778 | "description": "Veniam consequat aliquip voluptate in velit."
779 | },
780 | {
781 | "id": "54e1a204a9368eb4b4bd1a5f",
782 | "format": "",
783 | "url": "http://ourimageserver/326b6040-d725-4618-b8eb-38ab8617550d",
784 | "description": "Ea ad dolor nostrud magna eu sit nisi do nisi et ut cupidatat excepteur officia."
785 | }
786 | ],
787 | "greeting": "Hello, Flossie! You have 8 unread messages.",
788 | "favorite_fruit": "banana"
789 | },
790 | {
791 | "_id": "54e1a2048bb454f0a5ac8bde",
792 | "index": 7,
793 | "guid": "72a91cb6-7c27-4f34-82f5-14db8296047f",
794 | "is_active": true,
795 | "balance": "$3,118.69",
796 | "picture": "http://placehold.it/32x32",
797 | "age": 26,
798 | "eye_color": "green",
799 | "name": {
800 | "first": "Lillie",
801 | "last": "Burks"
802 | },
803 | "company": "PLUTORQUE",
804 | "email": "lillie.burks@plutorque.us",
805 | "phone": "+1 (910) 536-3488",
806 | "address": "293 Stoddard Place, Statenville, Maryland, 116",
807 | "about": "Minim proident ut fugiat dolore occaecat esse eu dolor magna duis officia. Officia duis tempor dolore minim fugiat. Consequat ex occaecat nostrud ullamco. Aliqua incididunt sit labore aute amet. Ut est aliqua commodo adipisicing quis magna dolore sit do quis aliqua.\r\n",
808 | "registered": "Tuesday, August 19, 2014 10:04 PM",
809 | "latitude": -47.941124,
810 | "longitude": -173.005552,
811 | "tags": [
812 | "minim",
813 | "dolor",
814 | "excepteur",
815 | "minim",
816 | "velit",
817 | "sit",
818 | "dolor"
819 | ],
820 | "range": [
821 | 0,
822 | 1,
823 | 2,
824 | 3,
825 | 4,
826 | 5,
827 | 6,
828 | 7,
829 | 8,
830 | 9
831 | ],
832 | "friends": [
833 | {
834 | "id": 0,
835 | "name": "Harrison Kaufman"
836 | },
837 | {
838 | "id": 1,
839 | "name": "Marjorie Davenport"
840 | },
841 | {
842 | "id": 2,
843 | "name": "Judy Wagner"
844 | }
845 | ],
846 | "images": [
847 | {
848 | "id": "54e1a20466363226901ee72f",
849 | "format": "",
850 | "url": "http://ourimageserver/6a731a8a-f00a-4f25-a15f-2b6e5f799ea0",
851 | "description": "Sunt aliquip consequat aliqua tempor dolore pariatur esse consectetur ex."
852 | },
853 | {
854 | "id": "54e1a20473e1165ea1c2cc28",
855 | "format": "",
856 | "url": "http://ourimageserver/868419f5-3af9-4830-929e-39bf185a45c7",
857 | "description": "Nulla et amet cupidatat eu culpa duis consectetur ullamco nulla eu deserunt ipsum."
858 | },
859 | {
860 | "id": "54e1a204fdb7e4543536c3e0",
861 | "format": "",
862 | "url": "http://ourimageserver/6307a8fa-9914-4d96-9729-08e6c648b182",
863 | "description": "Voluptate velit cillum tempor consectetur veniam laboris adipisicing cillum deserunt proident laboris anim non cupidatat."
864 | },
865 | {
866 | "id": "54e1a20446310c30e1572301",
867 | "format": "",
868 | "url": "http://ourimageserver/2a7ab70d-b695-40fe-93bc-e184560f6ad3",
869 | "description": "Nostrud consectetur adipisicing labore anim ipsum ex laboris."
870 | },
871 | {
872 | "id": "54e1a2049daaf3135430cb2d",
873 | "format": "",
874 | "url": "http://ourimageserver/056293f0-1276-426f-8341-294c0123e47d",
875 | "description": "Occaecat anim ullamco ea aliqua amet culpa ut esse velit nostrud irure sunt velit."
876 | },
877 | {
878 | "id": "54e1a204030d8cacd972dda4",
879 | "format": "",
880 | "url": "http://ourimageserver/8b24ed04-1d7a-4410-8d96-54caf670810c",
881 | "description": "Elit nulla nulla velit reprehenderit consequat anim excepteur voluptate magna excepteur."
882 | },
883 | {
884 | "id": "54e1a20463dfe7c44d5ed592",
885 | "format": "",
886 | "url": "http://ourimageserver/c096e657-6812-4c6f-8289-0df89d2a7acd",
887 | "description": "Sit sit minim dolor in commodo ut nulla est labore deserunt sunt magna fugiat."
888 | },
889 | {
890 | "id": "54e1a2041cec1ae775b7f386",
891 | "format": "",
892 | "url": "http://ourimageserver/f4024faf-1f96-46f1-9ffb-c11cbddfda36",
893 | "description": "Elit quis ullamco labore quis sunt anim cupidatat voluptate laborum sint irure commodo mollit."
894 | },
895 | {
896 | "id": "54e1a20481f1dfc3dc0aedc6",
897 | "format": "",
898 | "url": "http://ourimageserver/568f0565-1d11-4726-b877-f1be39ed3e4d",
899 | "description": "Id Lorem excepteur laboris sint cupidatat magna occaecat ea incididunt."
900 | },
901 | {
902 | "id": "54e1a2048aaf83f6d5400e3d",
903 | "format": "",
904 | "url": "http://ourimageserver/cd8f7e63-8abe-434c-b805-9babee4fe7dd",
905 | "description": "Ut dolore ad nisi cillum mollit."
906 | },
907 | {
908 | "id": "54e1a2045224f34efaeb9f80",
909 | "format": "",
910 | "url": "http://ourimageserver/b8f4e233-e294-4895-9759-27176527d02f",
911 | "description": "Incididunt laboris est qui cupidatat pariatur officia qui ullamco voluptate."
912 | },
913 | {
914 | "id": "54e1a2043f99cbf05e4851fe",
915 | "format": "",
916 | "url": "http://ourimageserver/21bdbacb-da2e-473a-b78c-d1045a3033cc",
917 | "description": "Nulla sunt nostrud sunt cillum magna minim Lorem veniam."
918 | }
919 | ],
920 | "greeting": "Hello, Lillie! You have 7 unread messages.",
921 | "favorite_fruit": "apple"
922 | },
923 | {
924 | "_id": "54e1a204d5aab291b492796b",
925 | "index": 8,
926 | "guid": "a339098d-b961-449e-8fc0-32ef90c77086",
927 | "is_active": true,
928 | "balance": "$1,568.48",
929 | "picture": "http://placehold.it/32x32",
930 | "age": 24,
931 | "eye_color": "blue",
932 | "name": {
933 | "first": "Kitty",
934 | "last": "Bailey"
935 | },
936 | "company": "BOINK",
937 | "email": "kitty.bailey@boink.io",
938 | "phone": "+1 (975) 442-2301",
939 | "address": "811 Murdock Court, Hollins, Alaska, 4695",
940 | "about": "Esse reprehenderit tempor laboris nostrud. Cillum adipisicing ut ea minim laborum qui eu consequat qui cupidatat cupidatat reprehenderit nisi. Consectetur occaecat fugiat pariatur sunt aliqua ut.\r\n",
941 | "registered": "Thursday, May 8, 2014 1:42 AM",
942 | "latitude": -8.217496,
943 | "longitude": -137.05907,
944 | "tags": [
945 | "Lorem",
946 | "tempor",
947 | "quis",
948 | "aliqua",
949 | "esse",
950 | "enim",
951 | "velit"
952 | ],
953 | "range": [
954 | 0,
955 | 1,
956 | 2,
957 | 3,
958 | 4,
959 | 5,
960 | 6,
961 | 7,
962 | 8,
963 | 9
964 | ],
965 | "friends": [
966 | {
967 | "id": 0,
968 | "name": "Little Potts"
969 | },
970 | {
971 | "id": 1,
972 | "name": "Valerie Moore"
973 | },
974 | {
975 | "id": 2,
976 | "name": "Johnnie Gillespie"
977 | }
978 | ],
979 | "images": [
980 | {
981 | "id": "54e1a204db32e579058d1608",
982 | "format": "",
983 | "url": "http://ourimageserver/9ae53875-64de-4403-a0ea-ef72b01de8cb",
984 | "description": "Id occaecat veniam commodo dolor."
985 | },
986 | {
987 | "id": "54e1a204237af148165f5c0d",
988 | "format": "",
989 | "url": "http://ourimageserver/fe832e99-009d-42b9-b856-2c335caf1057",
990 | "description": "Nulla consequat in fugiat minim laborum Lorem aliquip eu amet dolore qui adipisicing."
991 | },
992 | {
993 | "id": "54e1a204377aa44ac6aac74c",
994 | "format": "",
995 | "url": "http://ourimageserver/5536d59b-9a19-476e-b14f-86793e47c7b9",
996 | "description": "Aliqua fugiat reprehenderit sit irure sit voluptate sint ex aliquip tempor voluptate officia incididunt."
997 | },
998 | {
999 | "id": "54e1a2045b6393a42eda4618",
1000 | "format": "",
1001 | "url": "http://ourimageserver/7e5f178b-ea0b-4fdc-bc0f-4e1e15197262",
1002 | "description": "Minim nostrud sint veniam nisi aliqua laborum quis irure cupidatat nulla fugiat officia."
1003 | },
1004 | {
1005 | "id": "54e1a204dd302e6fe50a005a",
1006 | "format": "",
1007 | "url": "http://ourimageserver/fc8c16fd-5f19-4281-8ef8-bed179c8230b",
1008 | "description": "Sunt minim occaecat ex id amet."
1009 | },
1010 | {
1011 | "id": "54e1a204da334ba9298254ed",
1012 | "format": "",
1013 | "url": "http://ourimageserver/608bfa21-cb48-4090-adc3-73599379192c",
1014 | "description": "Irure non et nostrud ipsum in est cillum culpa."
1015 | },
1016 | {
1017 | "id": "54e1a204c50757cc375429ff",
1018 | "format": "",
1019 | "url": "http://ourimageserver/475a906b-d7d7-420a-8ab2-6e344cb765ac",
1020 | "description": "Proident Lorem laborum do elit culpa excepteur officia eu Lorem excepteur."
1021 | },
1022 | {
1023 | "id": "54e1a2048fcbda5596efefea",
1024 | "format": "",
1025 | "url": "http://ourimageserver/92ac8e2a-34ce-481b-9b38-4f71e0695fee",
1026 | "description": "Magna Lorem est voluptate enim fugiat incididunt qui esse ex velit pariatur nostrud labore."
1027 | }
1028 | ],
1029 | "greeting": "Hello, Kitty! You have 9 unread messages.",
1030 | "favorite_fruit": "apple"
1031 | },
1032 | {
1033 | "_id": "54e1a2045bf21ab6a48136a1",
1034 | "index": 9,
1035 | "guid": "0dc4870a-1044-4bbf-9a79-d590b2498009",
1036 | "is_active": false,
1037 | "balance": "$2,669.86",
1038 | "picture": "http://placehold.it/32x32",
1039 | "age": 33,
1040 | "eye_color": "green",
1041 | "name": {
1042 | "first": "Lindsey",
1043 | "last": "Brooks"
1044 | },
1045 | "company": "CRUSTATIA",
1046 | "email": "lindsey.brooks@crustatia.com",
1047 | "phone": "+1 (816) 529-3968",
1048 | "address": "701 Hamilton Avenue, Ona, North Dakota, 3885",
1049 | "about": "Proident laborum cupidatat adipisicing non ea dolore irure nulla commodo incididunt eiusmod dolor proident do. Dolor ex aliqua commodo do incididunt adipisicing adipisicing id magna do sint enim. Consequat ipsum eu excepteur irure Lorem.\r\n",
1050 | "registered": "Friday, June 27, 2014 11:32 PM",
1051 | "latitude": -7.004335,
1052 | "longitude": -122.127942,
1053 | "tags": [
1054 | "irure",
1055 | "duis",
1056 | "mollit",
1057 | "eu",
1058 | "ipsum",
1059 | "ea",
1060 | "officia"
1061 | ],
1062 | "range": [
1063 | 0,
1064 | 1,
1065 | 2,
1066 | 3,
1067 | 4,
1068 | 5,
1069 | 6,
1070 | 7,
1071 | 8,
1072 | 9
1073 | ],
1074 | "friends": [
1075 | {
1076 | "id": 0,
1077 | "name": "Georgina Gray"
1078 | },
1079 | {
1080 | "id": 1,
1081 | "name": "Annette Neal"
1082 | },
1083 | {
1084 | "id": 2,
1085 | "name": "Walsh Deleon"
1086 | }
1087 | ],
1088 | "images": [
1089 | {
1090 | "id": "54e1a204725ad3eb8da07f5e",
1091 | "format": "",
1092 | "url": "http://ourimageserver/62372fc4-0a8b-4040-838d-8b561860668a",
1093 | "description": "Aute ad amet ipsum magna irure ea aliqua nostrud est aliquip."
1094 | },
1095 | {
1096 | "id": "54e1a204d8800c958920e371",
1097 | "format": "",
1098 | "url": "http://ourimageserver/cdd9d7dc-2cee-44b3-8b62-63a490f06dc7",
1099 | "description": "Consequat mollit consequat esse ad deserunt aute proident dolor magna."
1100 | }
1101 | ],
1102 | "greeting": "Hello, Lindsey! You have 10 unread messages.",
1103 | "favorite_fruit": "banana"
1104 | },
1105 | {
1106 | "_id": "54e1a204f19a7a3741ecfd9f",
1107 | "index": 10,
1108 | "guid": "ca3ecb3a-914d-44a0-a4dd-57eae5779bc0",
1109 | "is_active": true,
1110 | "balance": "$2,345.46",
1111 | "picture": "http://placehold.it/32x32",
1112 | "age": 27,
1113 | "eye_color": "green",
1114 | "name": {
1115 | "first": "Nixon",
1116 | "last": "Chandler"
1117 | },
1118 | "company": "LIQUICOM",
1119 | "email": "nixon.chandler@liquicom.name",
1120 | "phone": "+1 (997) 452-3087",
1121 | "address": "664 Prince Street, Wheaton, District Of Columbia, 4382",
1122 | "about": "Nisi excepteur culpa veniam reprehenderit tempor laborum ex excepteur deserunt consectetur amet quis proident qui. Nostrud eiusmod dolor minim officia aute elit sit pariatur consectetur tempor amet. Culpa minim in nisi fugiat sunt labore nisi deserunt adipisicing aliquip aliqua dolor. Anim qui nisi sunt commodo sit nulla incididunt amet voluptate ad laboris ex.\r\n",
1123 | "registered": "Tuesday, May 27, 2014 6:08 AM",
1124 | "latitude": -44.323327,
1125 | "longitude": -82.236605,
1126 | "tags": [
1127 | "veniam",
1128 | "consequat",
1129 | "labore",
1130 | "Lorem",
1131 | "excepteur",
1132 | "aliqua",
1133 | "laboris"
1134 | ],
1135 | "range": [
1136 | 0,
1137 | 1,
1138 | 2,
1139 | 3,
1140 | 4,
1141 | 5,
1142 | 6,
1143 | 7,
1144 | 8,
1145 | 9
1146 | ],
1147 | "friends": [
1148 | {
1149 | "id": 0,
1150 | "name": "Pollard Farrell"
1151 | },
1152 | {
1153 | "id": 1,
1154 | "name": "Bridgett Figueroa"
1155 | },
1156 | {
1157 | "id": 2,
1158 | "name": "Mcgowan Rivers"
1159 | }
1160 | ],
1161 | "images": [
1162 | {
1163 | "id": "54e1a204099718c89e39209e",
1164 | "format": "",
1165 | "url": "http://ourimageserver/fba179fb-a0dc-4e6b-a451-a9f9f879c059",
1166 | "description": "Culpa esse elit sit esse velit nulla elit anim."
1167 | },
1168 | {
1169 | "id": "54e1a204786dfa2a7e842499",
1170 | "format": "",
1171 | "url": "http://ourimageserver/a997cd1a-ca26-46cc-ace7-8200e3d468e1",
1172 | "description": "Dolor adipisicing culpa laborum ut dolore commodo in adipisicing deserunt aliqua reprehenderit."
1173 | }
1174 | ],
1175 | "greeting": "Hello, Nixon! You have 10 unread messages.",
1176 | "favorite_fruit": "strawberry"
1177 | },
1178 | {
1179 | "_id": "54e1a2044c544a3737b2dfa6",
1180 | "index": 11,
1181 | "guid": "81fdb943-d80d-439b-bc64-846f4c0b343d",
1182 | "is_active": false,
1183 | "balance": "$1,733.84",
1184 | "picture": "http://placehold.it/32x32",
1185 | "age": 22,
1186 | "eye_color": "blue",
1187 | "name": {
1188 | "first": "Lauren",
1189 | "last": "Randolph"
1190 | },
1191 | "company": "DECRATEX",
1192 | "email": "lauren.randolph@decratex.biz",
1193 | "phone": "+1 (965) 569-3887",
1194 | "address": "146 Lorimer Street, Dupuyer, Massachusetts, 1387",
1195 | "about": "Tempor Lorem sit nostrud aute quis mollit voluptate commodo irure. Non dolor cillum in nisi incididunt dolore. Duis excepteur mollit labore exercitation sint cillum cupidatat voluptate tempor laboris. Ad anim aliqua est irure. Culpa consectetur dolor quis aute irure deserunt consequat aliquip occaecat aute elit cupidatat eiusmod ut. Et quis est eiusmod magna aliquip occaecat. Duis consequat ea cupidatat Lorem irure laborum culpa nulla voluptate.\r\n",
1196 | "registered": "Friday, January 10, 2014 12:35 AM",
1197 | "latitude": 80.593715,
1198 | "longitude": -102.683865,
1199 | "tags": [
1200 | "incididunt",
1201 | "esse",
1202 | "ipsum",
1203 | "enim",
1204 | "consequat",
1205 | "officia",
1206 | "ex"
1207 | ],
1208 | "range": [
1209 | 0,
1210 | 1,
1211 | 2,
1212 | 3,
1213 | 4,
1214 | 5,
1215 | 6,
1216 | 7,
1217 | 8,
1218 | 9
1219 | ],
1220 | "friends": [
1221 | {
1222 | "id": 0,
1223 | "name": "Haney Oneill"
1224 | },
1225 | {
1226 | "id": 1,
1227 | "name": "Bowen Chambers"
1228 | },
1229 | {
1230 | "id": 2,
1231 | "name": "Brandie Newman"
1232 | }
1233 | ],
1234 | "images": [
1235 | {
1236 | "id": "54e1a2041ad7ae2d9d04a1bf",
1237 | "format": "",
1238 | "url": "http://ourimageserver/66f18f57-3410-4508-aa6f-5e4b08480e10",
1239 | "description": "Ullamco amet duis reprehenderit laboris amet."
1240 | },
1241 | {
1242 | "id": "54e1a204f47e17b6b48cb758",
1243 | "format": "",
1244 | "url": "http://ourimageserver/493e0133-ffb5-4ba7-a557-d2292ad58d69",
1245 | "description": "Amet nulla adipisicing est do reprehenderit occaecat consequat nulla ipsum amet."
1246 | },
1247 | {
1248 | "id": "54e1a2041e23de552133c588",
1249 | "format": "",
1250 | "url": "http://ourimageserver/4f8c3e1c-40f3-4354-84b4-3ed2d041f6b6",
1251 | "description": "Amet qui ex excepteur nulla nisi dolor nostrud aliquip dolore exercitation nisi."
1252 | },
1253 | {
1254 | "id": "54e1a204de55b31a2bafa28a",
1255 | "format": "",
1256 | "url": "http://ourimageserver/af6e11c8-d765-4632-bea3-8af6c9244709",
1257 | "description": "Fugiat consectetur cillum qui mollit ex quis non duis occaecat occaecat Lorem."
1258 | },
1259 | {
1260 | "id": "54e1a20452e24c11e162cb31",
1261 | "format": "",
1262 | "url": "http://ourimageserver/32f9fddd-ab15-4a61-b796-6b60e3acd55c",
1263 | "description": "Eiusmod commodo ad irure sint laboris pariatur sint ad sunt nisi est."
1264 | },
1265 | {
1266 | "id": "54e1a204ecaa3489a3603ee5",
1267 | "format": "",
1268 | "url": "http://ourimageserver/3fa0df7b-e3d4-4749-8ee6-430073308b44",
1269 | "description": "Sunt cillum consequat proident ullamco ad ad."
1270 | },
1271 | {
1272 | "id": "54e1a2047af936924ffb1c38",
1273 | "format": "",
1274 | "url": "http://ourimageserver/9628a46a-0a93-4688-b80a-a60ab6fbf814",
1275 | "description": "Sunt dolor sunt occaecat consequat adipisicing ipsum amet ut proident magna do fugiat consequat aliquip."
1276 | },
1277 | {
1278 | "id": "54e1a2048e1e382445317fdc",
1279 | "format": "",
1280 | "url": "http://ourimageserver/dc101aa5-f6d2-47a4-8d33-efd42dd5a345",
1281 | "description": "Cupidatat eiusmod dolore tempor cillum nostrud et nisi mollit et nisi do ad."
1282 | }
1283 | ],
1284 | "greeting": "Hello, Lauren! You have 5 unread messages.",
1285 | "favorite_fruit": "banana"
1286 | },
1287 | {
1288 | "_id": "54e1a2043a17445c7d5c3143",
1289 | "index": 12,
1290 | "guid": "e5cf1683-c7f7-4a09-8464-43f515328d6d",
1291 | "is_active": true,
1292 | "balance": "$3,744.35",
1293 | "picture": "http://placehold.it/32x32",
1294 | "age": 27,
1295 | "eye_color": "brown",
1296 | "name": {
1297 | "first": "Lena",
1298 | "last": "Cash"
1299 | },
1300 | "company": "ENQUILITY",
1301 | "email": "lena.cash@enquility.net",
1302 | "phone": "+1 (887) 511-3916",
1303 | "address": "556 Roebling Street, Saticoy, Idaho, 6423",
1304 | "about": "Minim cupidatat nulla eu cillum aliquip do. Exercitation sint duis cillum non nulla. Quis laborum incididunt sunt duis irure occaecat proident veniam nisi. Nostrud sint consequat reprehenderit aliquip in nulla aute minim laborum anim veniam. Adipisicing est veniam et commodo. Sunt ex aliqua cupidatat culpa ex adipisicing adipisicing nulla pariatur. Eiusmod aliquip ex eu laboris mollit ipsum dolor eu qui ut labore pariatur nulla.\r\n",
1305 | "registered": "Friday, February 13, 2015 8:12 AM",
1306 | "latitude": 4.761905,
1307 | "longitude": -133.186767,
1308 | "tags": [
1309 | "laboris",
1310 | "esse",
1311 | "fugiat",
1312 | "veniam",
1313 | "cillum",
1314 | "magna",
1315 | "cillum"
1316 | ],
1317 | "range": [
1318 | 0,
1319 | 1,
1320 | 2,
1321 | 3,
1322 | 4,
1323 | 5,
1324 | 6,
1325 | 7,
1326 | 8,
1327 | 9
1328 | ],
1329 | "friends": [
1330 | {
1331 | "id": 0,
1332 | "name": "Mcmillan Horn"
1333 | },
1334 | {
1335 | "id": 1,
1336 | "name": "Cantu Byers"
1337 | },
1338 | {
1339 | "id": 2,
1340 | "name": "Ruthie Cohen"
1341 | }
1342 | ],
1343 | "images": [
1344 | {
1345 | "id": "54e1a20483d7bec96a328743",
1346 | "format": "",
1347 | "url": "http://ourimageserver/087921ec-4148-47db-833f-d3d7ea24cc1f",
1348 | "description": "Sunt cillum incididunt sit consectetur ad qui excepteur dolor sint reprehenderit enim ea."
1349 | },
1350 | {
1351 | "id": "54e1a2044bb3828aa7d77266",
1352 | "format": "",
1353 | "url": "http://ourimageserver/225ba636-c82e-4e47-af02-a6004d254046",
1354 | "description": "Cupidatat sunt occaecat aliqua minim labore fugiat Lorem magna aliquip duis."
1355 | },
1356 | {
1357 | "id": "54e1a2044415f44b35d1691a",
1358 | "format": "",
1359 | "url": "http://ourimageserver/05de9058-357e-42c9-bfda-4472fa6254af",
1360 | "description": "Ut duis minim aliqua ea cupidatat tempor nostrud."
1361 | },
1362 | {
1363 | "id": "54e1a204d39fec48d13f2dc9",
1364 | "format": "",
1365 | "url": "http://ourimageserver/22537a69-c878-4028-8a0e-89037033282a",
1366 | "description": "Mollit commodo non consectetur consequat excepteur excepteur minim in Lorem nisi incididunt cupidatat sint adipisicing."
1367 | },
1368 | {
1369 | "id": "54e1a204c7ae291bf1dca7e9",
1370 | "format": "",
1371 | "url": "http://ourimageserver/03e77e6b-7694-4ffe-a4e1-14e127b24c35",
1372 | "description": "Cillum ex occaecat nostrud est culpa excepteur aliquip amet."
1373 | },
1374 | {
1375 | "id": "54e1a204e963228796c458c6",
1376 | "format": "",
1377 | "url": "http://ourimageserver/84b1eb62-1e72-4f26-8d43-0f6f90da59b7",
1378 | "description": "Quis nisi tempor minim officia voluptate aute magna."
1379 | },
1380 | {
1381 | "id": "54e1a204b35afea1bb6aeb68",
1382 | "format": "",
1383 | "url": "http://ourimageserver/1a4169b2-d1ab-4a2e-9350-e6be8ccea7e7",
1384 | "description": "Excepteur dolore adipisicing ea deserunt eu reprehenderit eiusmod duis ad aliquip magna deserunt ut non."
1385 | },
1386 | {
1387 | "id": "54e1a2041957d1f43c2844af",
1388 | "format": "",
1389 | "url": "http://ourimageserver/917fd9e5-ce58-43ab-8b81-0feda196a077",
1390 | "description": "Aute enim eu eiusmod non cillum ad elit magna officia."
1391 | }
1392 | ],
1393 | "greeting": "Hello, Lena! You have 6 unread messages.",
1394 | "favorite_fruit": "strawberry"
1395 | },
1396 | {
1397 | "_id": "54e1a204c8342cc1de4dbb51",
1398 | "index": 13,
1399 | "guid": "49e49b62-22c7-465d-b1d3-4ba41b90f91b",
1400 | "is_active": true,
1401 | "balance": "$1,364.53",
1402 | "picture": "http://placehold.it/32x32",
1403 | "age": 30,
1404 | "eye_color": "green",
1405 | "name": {
1406 | "first": "Peggy",
1407 | "last": "Glover"
1408 | },
1409 | "company": "DYMI",
1410 | "email": "peggy.glover@dymi.info",
1411 | "phone": "+1 (927) 403-3721",
1412 | "address": "578 Whitwell Place, Crown, Palau, 6820",
1413 | "about": "Reprehenderit quis nostrud voluptate ullamco laborum incididunt culpa aliqua non sit. Deserunt nulla quis magna ullamco laborum sunt excepteur eiusmod. Veniam est id qui id eiusmod commodo consequat ad incididunt esse. Minim ipsum elit pariatur magna id elit sunt voluptate occaecat non est culpa cupidatat.\r\n",
1414 | "registered": "Monday, November 24, 2014 1:16 AM",
1415 | "latitude": -26.726352,
1416 | "longitude": 39.406411,
1417 | "tags": [
1418 | "eu",
1419 | "amet",
1420 | "ipsum",
1421 | "non",
1422 | "officia",
1423 | "aliquip",
1424 | "aliquip"
1425 | ],
1426 | "range": [
1427 | 0,
1428 | 1,
1429 | 2,
1430 | 3,
1431 | 4,
1432 | 5,
1433 | 6,
1434 | 7,
1435 | 8,
1436 | 9
1437 | ],
1438 | "friends": [
1439 | {
1440 | "id": 0,
1441 | "name": "Keller Knox"
1442 | },
1443 | {
1444 | "id": 1,
1445 | "name": "Kristine Ramsey"
1446 | },
1447 | {
1448 | "id": 2,
1449 | "name": "Carmella Lee"
1450 | }
1451 | ],
1452 | "images": [
1453 | {
1454 | "id": "54e1a2045167eda9ec4c5c50",
1455 | "format": "",
1456 | "url": "http://ourimageserver/a995bba2-ad58-4fbe-aa45-2d83cf1da912",
1457 | "description": "Amet nisi culpa sit amet cupidatat."
1458 | },
1459 | {
1460 | "id": "54e1a204fc8dbbe37762354e",
1461 | "format": "",
1462 | "url": "http://ourimageserver/2c5fdc60-f1d4-405f-8db0-c83a538e7683",
1463 | "description": "Nostrud do et labore aliqua nisi sit et amet do."
1464 | },
1465 | {
1466 | "id": "54e1a20427d8df080abd58e6",
1467 | "format": "",
1468 | "url": "http://ourimageserver/e8d1f99a-8993-4613-aa92-1421e74dbb70",
1469 | "description": "Cupidatat esse tempor enim aute commodo ipsum occaecat incididunt nisi deserunt voluptate commodo duis pariatur."
1470 | },
1471 | {
1472 | "id": "54e1a204137ceffdebc6dcc2",
1473 | "format": "",
1474 | "url": "http://ourimageserver/86c9bd92-81a3-47e1-9407-958233fe588d",
1475 | "description": "Ut id velit ut et."
1476 | },
1477 | {
1478 | "id": "54e1a204c4ce3cbdde24a317",
1479 | "format": "",
1480 | "url": "http://ourimageserver/cb0fc24f-c789-4e5b-b036-baf9bde8c4fe",
1481 | "description": "Occaecat in amet cupidatat dolore nisi nostrud nulla excepteur."
1482 | },
1483 | {
1484 | "id": "54e1a204b98333a6d4c1d417",
1485 | "format": "",
1486 | "url": "http://ourimageserver/ccdb272b-2d1f-432e-ab0f-4a4e1dfb93c6",
1487 | "description": "Pariatur id sint dolore qui enim sunt ad Lorem nulla."
1488 | },
1489 | {
1490 | "id": "54e1a204a5571a51344db5d0",
1491 | "format": "",
1492 | "url": "http://ourimageserver/19434f4c-8de9-417c-a0d1-4dcda2c2c882",
1493 | "description": "Velit culpa irure ipsum duis velit aute nisi et cupidatat sint culpa et do."
1494 | },
1495 | {
1496 | "id": "54e1a2041e314b01a757d063",
1497 | "format": "",
1498 | "url": "http://ourimageserver/86f4ce83-30f2-40af-87b0-ca10f38e4e12",
1499 | "description": "Tempor velit cillum consectetur non."
1500 | },
1501 | {
1502 | "id": "54e1a204f32bef3fa03c8769",
1503 | "format": "",
1504 | "url": "http://ourimageserver/3d1234eb-31e2-4dcc-a9d8-9e61457a1a1d",
1505 | "description": "Anim voluptate consectetur Lorem reprehenderit occaecat id voluptate commodo id ut voluptate labore pariatur."
1506 | }
1507 | ],
1508 | "greeting": "Hello, Peggy! You have 9 unread messages.",
1509 | "favorite_fruit": "banana"
1510 | },
1511 | {
1512 | "_id": "54e1a204cb72781f9b50fe06",
1513 | "index": 14,
1514 | "guid": "a61bd3e3-ca82-45e1-b795-f0ae0e221a1c",
1515 | "is_active": false,
1516 | "balance": "$2,234.29",
1517 | "picture": "http://placehold.it/32x32",
1518 | "age": 23,
1519 | "eye_color": "blue",
1520 | "name": {
1521 | "first": "Gabriela",
1522 | "last": "Beasley"
1523 | },
1524 | "company": "APEX",
1525 | "email": "gabriela.beasley@apex.org",
1526 | "phone": "+1 (832) 590-2568",
1527 | "address": "408 Hancock Street, Baker, Colorado, 9162",
1528 | "about": "Non minim reprehenderit aliqua aute ullamco duis occaecat. Aliquip dolor ut ad ad tempor dolor quis voluptate. Deserunt exercitation enim exercitation velit. In mollit veniam proident laboris excepteur incididunt officia minim. Lorem amet ex ex adipisicing elit officia ullamco. Cillum magna incididunt sint nostrud cillum qui reprehenderit ea consequat minim.\r\n",
1529 | "registered": "Friday, January 30, 2015 1:57 PM",
1530 | "latitude": 21.924746,
1531 | "longitude": -53.441414,
1532 | "tags": [
1533 | "tempor",
1534 | "ad",
1535 | "cillum",
1536 | "do",
1537 | "elit",
1538 | "cupidatat",
1539 | "ad"
1540 | ],
1541 | "range": [
1542 | 0,
1543 | 1,
1544 | 2,
1545 | 3,
1546 | 4,
1547 | 5,
1548 | 6,
1549 | 7,
1550 | 8,
1551 | 9
1552 | ],
1553 | "friends": [
1554 | {
1555 | "id": 0,
1556 | "name": "Dyer Greer"
1557 | },
1558 | {
1559 | "id": 1,
1560 | "name": "Fanny Estrada"
1561 | },
1562 | {
1563 | "id": 2,
1564 | "name": "Woodward Hawkins"
1565 | }
1566 | ],
1567 | "images": [
1568 | {
1569 | "id": "54e1a204b5b982147eb754b5",
1570 | "format": "",
1571 | "url": "http://ourimageserver/20b8c86e-e0c3-41ff-822f-b3746ca94352",
1572 | "description": "Minim cupidatat cupidatat do irure tempor pariatur est ipsum enim nisi officia esse."
1573 | },
1574 | {
1575 | "id": "54e1a204e6e04aa319163995",
1576 | "format": "",
1577 | "url": "http://ourimageserver/6f502adb-445c-42e7-8213-ef2ea2b03be4",
1578 | "description": "Ipsum id tempor ex officia commodo culpa non ex in."
1579 | },
1580 | {
1581 | "id": "54e1a204daaa73c82865d787",
1582 | "format": "",
1583 | "url": "http://ourimageserver/5e3674ff-dc19-47a8-a3bf-21e1ad61c9d7",
1584 | "description": "Minim aliquip nostrud nisi cillum eiusmod ut reprehenderit consectetur qui nostrud reprehenderit nostrud consectetur."
1585 | }
1586 | ],
1587 | "greeting": "Hello, Gabriela! You have 9 unread messages.",
1588 | "favorite_fruit": "banana"
1589 | },
1590 | {
1591 | "_id": "54e1a204f3fda49777cf04a0",
1592 | "index": 15,
1593 | "guid": "1119d36a-6fc3-4e5e-b2e6-ed9e5f488624",
1594 | "is_active": true,
1595 | "balance": "$3,942.81",
1596 | "picture": "http://placehold.it/32x32",
1597 | "age": 40,
1598 | "eye_color": "brown",
1599 | "name": {
1600 | "first": "Kaufman",
1601 | "last": "Harding"
1602 | },
1603 | "company": "ECSTASIA",
1604 | "email": "kaufman.harding@ecstasia.ca",
1605 | "phone": "+1 (890) 569-2917",
1606 | "address": "781 Polhemus Place, Leroy, Connecticut, 9425",
1607 | "about": "Ea aliqua qui commodo magna eiusmod sit adipisicing sint exercitation fugiat aute voluptate dolor cillum. Esse et amet culpa ea minim anim aliquip officia ut occaecat laboris fugiat. Consequat qui enim excepteur pariatur duis ad. Ipsum eu proident reprehenderit elit minim consequat sint aliquip ea incididunt. Qui consectetur ad reprehenderit elit esse.\r\n",
1608 | "registered": "Monday, August 11, 2014 9:22 AM",
1609 | "latitude": 44.917063,
1610 | "longitude": 67.50841,
1611 | "tags": [
1612 | "culpa",
1613 | "proident",
1614 | "ut",
1615 | "sint",
1616 | "sint",
1617 | "fugiat",
1618 | "commodo"
1619 | ],
1620 | "range": [
1621 | 0,
1622 | 1,
1623 | 2,
1624 | 3,
1625 | 4,
1626 | 5,
1627 | 6,
1628 | 7,
1629 | 8,
1630 | 9
1631 | ],
1632 | "friends": [
1633 | {
1634 | "id": 0,
1635 | "name": "Erma Barlow"
1636 | },
1637 | {
1638 | "id": 1,
1639 | "name": "Magdalena Sykes"
1640 | },
1641 | {
1642 | "id": 2,
1643 | "name": "Small Cannon"
1644 | }
1645 | ],
1646 | "images": [
1647 | {
1648 | "id": "54e1a2047760c3920c8ead52",
1649 | "format": "",
1650 | "url": "http://ourimageserver/e944a5e1-5799-47e9-84e3-c95815b04a47",
1651 | "description": "Minim aliquip tempor sint sit veniam deserunt veniam aliquip."
1652 | },
1653 | {
1654 | "id": "54e1a20441533055e61795c4",
1655 | "format": "",
1656 | "url": "http://ourimageserver/dfa58ad5-4a72-4106-b614-2a20108b6872",
1657 | "description": "Ullamco id nisi velit magna non nisi anim aute."
1658 | },
1659 | {
1660 | "id": "54e1a204b1cdfa4d3f2442d5",
1661 | "format": "",
1662 | "url": "http://ourimageserver/65996dff-0556-4108-ae72-75d5fb5bfdce",
1663 | "description": "Anim aliquip sit proident laboris do labore non occaecat deserunt."
1664 | },
1665 | {
1666 | "id": "54e1a204e88099d7dac1846b",
1667 | "format": "",
1668 | "url": "http://ourimageserver/72124fa7-8be1-4647-b82c-870423a88329",
1669 | "description": "Nisi incididunt occaecat nostrud minim."
1670 | }
1671 | ],
1672 | "greeting": "Hello, Kaufman! You have 6 unread messages.",
1673 | "favorite_fruit": "strawberry"
1674 | },
1675 | {
1676 | "_id": "54e1a2042cc149567e24c718",
1677 | "index": 16,
1678 | "guid": "460a8000-5ffc-4bfb-bb41-da48a147ca59",
1679 | "is_active": true,
1680 | "balance": "$1,308.74",
1681 | "picture": "http://placehold.it/32x32",
1682 | "age": 31,
1683 | "eye_color": "brown",
1684 | "name": {
1685 | "first": "Joann",
1686 | "last": "Noble"
1687 | },
1688 | "company": "NSPIRE",
1689 | "email": "joann.noble@nspire.co.uk",
1690 | "phone": "+1 (897) 462-3034",
1691 | "address": "810 Diamond Street, Shepardsville, Michigan, 5332",
1692 | "about": "Consequat ut Lorem dolor nulla incididunt eu ipsum. Anim duis consectetur cupidatat exercitation id proident veniam sit sint commodo nisi nostrud ipsum. Ipsum aliqua reprehenderit amet est id excepteur. Dolore in consectetur ut cillum mollit anim ullamco tempor non voluptate. Aliqua ex fugiat tempor sint non. Reprehenderit sint do laborum commodo deserunt occaecat consectetur consectetur nostrud ut. Labore sit et adipisicing officia excepteur.\r\n",
1693 | "registered": "Monday, January 12, 2015 7:09 PM",
1694 | "latitude": 53.493384,
1695 | "longitude": -93.829806,
1696 | "tags": [
1697 | "magna",
1698 | "duis",
1699 | "labore",
1700 | "deserunt",
1701 | "ullamco",
1702 | "ut",
1703 | "sunt"
1704 | ],
1705 | "range": [
1706 | 0,
1707 | 1,
1708 | 2,
1709 | 3,
1710 | 4,
1711 | 5,
1712 | 6,
1713 | 7,
1714 | 8,
1715 | 9
1716 | ],
1717 | "friends": [
1718 | {
1719 | "id": 0,
1720 | "name": "Tanisha Mejia"
1721 | },
1722 | {
1723 | "id": 1,
1724 | "name": "Kathy Pacheco"
1725 | },
1726 | {
1727 | "id": 2,
1728 | "name": "Lou Hess"
1729 | }
1730 | ],
1731 | "images": [
1732 | {
1733 | "id": "54e1a2045feab039ba38fd41",
1734 | "format": "",
1735 | "url": "http://ourimageserver/c299917f-ebc4-40fe-92a1-dab4230879d6",
1736 | "description": "Adipisicing nostrud mollit proident culpa laboris laboris incididunt pariatur ad consectetur."
1737 | },
1738 | {
1739 | "id": "54e1a2046ba827702e26d6b7",
1740 | "format": "",
1741 | "url": "http://ourimageserver/5e9dddbf-4185-403d-97f3-ee45539cef89",
1742 | "description": "Excepteur irure incididunt pariatur excepteur officia labore laboris laborum ut."
1743 | },
1744 | {
1745 | "id": "54e1a20475aac1e4a6157988",
1746 | "format": "",
1747 | "url": "http://ourimageserver/73321e68-6934-4c54-814a-ef611a1e068f",
1748 | "description": "Id aliqua sunt adipisicing elit veniam."
1749 | },
1750 | {
1751 | "id": "54e1a2040d22b8a920dd2f1d",
1752 | "format": "",
1753 | "url": "http://ourimageserver/e6ce3bdc-2c7c-4c8a-95cf-fe6ed188b891",
1754 | "description": "Cillum ullamco duis esse ea amet reprehenderit aute sit proident."
1755 | },
1756 | {
1757 | "id": "54e1a204dcacaa512b800a5b",
1758 | "format": "",
1759 | "url": "http://ourimageserver/625d3674-09a3-46c6-ad94-1a191c2ad251",
1760 | "description": "Veniam non incididunt velit ullamco est laborum amet dolor ea aliqua nostrud ut."
1761 | }
1762 | ],
1763 | "greeting": "Hello, Joann! You have 7 unread messages.",
1764 | "favorite_fruit": "apple"
1765 | },
1766 | {
1767 | "_id": "54e1a2049e8527ca7b2c8d1f",
1768 | "index": 17,
1769 | "guid": "bcdc48a5-a5bf-4c7d-ac3f-985778f76dad",
1770 | "is_active": true,
1771 | "balance": "$1,914.27",
1772 | "picture": "http://placehold.it/32x32",
1773 | "age": 27,
1774 | "eye_color": "blue",
1775 | "name": {
1776 | "first": "Hooper",
1777 | "last": "Blair"
1778 | },
1779 | "company": "DRAGBOT",
1780 | "email": "hooper.blair@dragbot.biz",
1781 | "phone": "+1 (878) 593-2922",
1782 | "address": "796 Highland Avenue, Bagtown, Guam, 9922",
1783 | "about": "Laboris fugiat dolor est esse ipsum qui sint non dolor ad anim tempor nulla esse. Commodo irure commodo qui laboris ex cupidatat nisi ad quis sint nisi esse nisi. Deserunt nulla ullamco minim commodo reprehenderit laborum do excepteur do velit duis occaecat labore quis.\r\n",
1784 | "registered": "Tuesday, May 6, 2014 1:15 AM",
1785 | "latitude": 25.611189,
1786 | "longitude": -129.122479,
1787 | "tags": [
1788 | "adipisicing",
1789 | "ea",
1790 | "laboris",
1791 | "et",
1792 | "veniam",
1793 | "laborum",
1794 | "eu"
1795 | ],
1796 | "range": [
1797 | 0,
1798 | 1,
1799 | 2,
1800 | 3,
1801 | 4,
1802 | 5,
1803 | 6,
1804 | 7,
1805 | 8,
1806 | 9
1807 | ],
1808 | "friends": [
1809 | {
1810 | "id": 0,
1811 | "name": "Bobbie Reed"
1812 | },
1813 | {
1814 | "id": 1,
1815 | "name": "Castaneda Brennan"
1816 | },
1817 | {
1818 | "id": 2,
1819 | "name": "Oconnor Bush"
1820 | }
1821 | ],
1822 | "images": [
1823 | {
1824 | "id": "54e1a204dd26c7f775abfcdf",
1825 | "format": "",
1826 | "url": "http://ourimageserver/ae707edd-133d-45ca-9c76-fa7e10e82ec9",
1827 | "description": "Incididunt anim reprehenderit dolor amet commodo occaecat proident aute amet cupidatat nisi sint nostrud mollit."
1828 | },
1829 | {
1830 | "id": "54e1a204630ae96039bf6bd2",
1831 | "format": "",
1832 | "url": "http://ourimageserver/f300e3a5-a46c-436e-943d-5e1a64b09d10",
1833 | "description": "Qui occaecat adipisicing commodo ad eu aliquip culpa sint."
1834 | },
1835 | {
1836 | "id": "54e1a2048e30ebd4156dfd17",
1837 | "format": "",
1838 | "url": "http://ourimageserver/e92bea24-c80e-46bc-86ac-7e2aa5ac57dc",
1839 | "description": "Dolore eiusmod incididunt dolor est commodo nisi commodo duis aliquip mollit."
1840 | },
1841 | {
1842 | "id": "54e1a20442216f2d581dc3a0",
1843 | "format": "",
1844 | "url": "http://ourimageserver/14b3f674-7fdc-49c0-b717-4004451cb378",
1845 | "description": "Deserunt voluptate aliqua elit eu ex proident cillum elit exercitation eu voluptate sunt culpa."
1846 | },
1847 | {
1848 | "id": "54e1a204bdfbaf7c402f0d24",
1849 | "format": "",
1850 | "url": "http://ourimageserver/c79277eb-7454-4af6-9678-afb70896f04d",
1851 | "description": "Laboris incididunt occaecat reprehenderit veniam ut aliqua qui aute esse anim qui."
1852 | },
1853 | {
1854 | "id": "54e1a204217174ddef0418c1",
1855 | "format": "",
1856 | "url": "http://ourimageserver/8a1f17b7-d93f-4522-a3cd-7c892dad6ef9",
1857 | "description": "Laborum sunt sit fugiat minim esse cupidatat commodo."
1858 | },
1859 | {
1860 | "id": "54e1a204ca8232547fd333d1",
1861 | "format": "",
1862 | "url": "http://ourimageserver/865d4ea6-00d7-4e03-b662-b09e92224d96",
1863 | "description": "Ad minim occaecat proident sint sint aliqua labore."
1864 | },
1865 | {
1866 | "id": "54e1a2047f26469f0ea7aca2",
1867 | "format": "",
1868 | "url": "http://ourimageserver/31966b51-5e24-48b6-b439-de8ee32673ce",
1869 | "description": "Lorem pariatur qui id esse dolore."
1870 | },
1871 | {
1872 | "id": "54e1a2049b6c6de3bca7c826",
1873 | "format": "",
1874 | "url": "http://ourimageserver/48c0ec58-e9d7-46b5-84e3-fdd52ec7c74b",
1875 | "description": "Incididunt est non reprehenderit quis."
1876 | },
1877 | {
1878 | "id": "54e1a204480f3c673a27643c",
1879 | "format": "",
1880 | "url": "http://ourimageserver/12e535fd-5402-4826-8e85-1deb76fb006e",
1881 | "description": "Non anim do adipisicing voluptate quis consectetur mollit do nostrud."
1882 | },
1883 | {
1884 | "id": "54e1a204537436bc08ba2d6b",
1885 | "format": "",
1886 | "url": "http://ourimageserver/580d72a6-a4e5-4047-917b-6a0685da258a",
1887 | "description": "Officia elit reprehenderit enim pariatur consectetur adipisicing."
1888 | }
1889 | ],
1890 | "greeting": "Hello, Hooper! You have 7 unread messages.",
1891 | "favorite_fruit": "banana"
1892 | },
1893 | {
1894 | "_id": "54e1a20422d519bac269584f",
1895 | "index": 18,
1896 | "guid": "4218da17-2135-4d90-b981-f2910499b031",
1897 | "is_active": false,
1898 | "balance": "$3,570.43",
1899 | "picture": "http://placehold.it/32x32",
1900 | "age": 32,
1901 | "eye_color": "green",
1902 | "name": {
1903 | "first": "Zelma",
1904 | "last": "Manning"
1905 | },
1906 | "company": "ZOGAK",
1907 | "email": "zelma.manning@zogak.me",
1908 | "phone": "+1 (897) 473-2320",
1909 | "address": "504 Buffalo Avenue, Sheatown, Texas, 8956",
1910 | "about": "Laboris exercitation irure ad ea Lorem eiusmod esse occaecat. Laborum reprehenderit nulla amet aliquip cupidatat laboris ipsum irure dolore. Nostrud voluptate cillum ea laboris ea et mollit adipisicing. Ea ex officia Lorem veniam adipisicing. Cupidatat aute irure culpa sit culpa elit velit.\r\n",
1911 | "registered": "Sunday, April 13, 2014 7:01 AM",
1912 | "latitude": -26.175323,
1913 | "longitude": -125.233294,
1914 | "tags": [
1915 | "quis",
1916 | "do",
1917 | "aliqua",
1918 | "labore",
1919 | "aute",
1920 | "ipsum",
1921 | "adipisicing"
1922 | ],
1923 | "range": [
1924 | 0,
1925 | 1,
1926 | 2,
1927 | 3,
1928 | 4,
1929 | 5,
1930 | 6,
1931 | 7,
1932 | 8,
1933 | 9
1934 | ],
1935 | "friends": [
1936 | {
1937 | "id": 0,
1938 | "name": "Reese Harper"
1939 | },
1940 | {
1941 | "id": 1,
1942 | "name": "Gertrude Walsh"
1943 | },
1944 | {
1945 | "id": 2,
1946 | "name": "Janie Bentley"
1947 | }
1948 | ],
1949 | "images": [
1950 | {
1951 | "id": "54e1a20487141609bb6fb126",
1952 | "format": "",
1953 | "url": "http://ourimageserver/0d48daf9-7d00-43e4-acc1-5a938b91c328",
1954 | "description": "Mollit irure et veniam amet pariatur Lorem velit veniam."
1955 | },
1956 | {
1957 | "id": "54e1a204405e2006fc97fd23",
1958 | "format": "",
1959 | "url": "http://ourimageserver/d08ce4c6-ba9d-4fb8-a30c-b93a401ce47b",
1960 | "description": "Pariatur ea do sit commodo est est laborum ullamco ea veniam labore dolore cillum amet."
1961 | },
1962 | {
1963 | "id": "54e1a2040b3feb761810eeb2",
1964 | "format": "",
1965 | "url": "http://ourimageserver/7c954520-30ad-46eb-9722-20abbf28b6be",
1966 | "description": "Duis cillum sunt magna sint exercitation aliquip aliqua nostrud cillum duis velit."
1967 | },
1968 | {
1969 | "id": "54e1a20448f360885a340422",
1970 | "format": "",
1971 | "url": "http://ourimageserver/ebd07540-d87a-4edb-8b44-3649fc919f2a",
1972 | "description": "In minim magna veniam duis occaecat deserunt eu."
1973 | }
1974 | ],
1975 | "greeting": "Hello, Zelma! You have 7 unread messages.",
1976 | "favorite_fruit": "strawberry"
1977 | },
1978 | {
1979 | "_id": "54e1a204048957d56fcd7032",
1980 | "index": 19,
1981 | "guid": "a2710724-de35-45ae-acc6-32acc212a055",
1982 | "is_active": false,
1983 | "balance": "$3,282.07",
1984 | "picture": "http://placehold.it/32x32",
1985 | "age": 29,
1986 | "eye_color": "brown",
1987 | "name": {
1988 | "first": "Tamera",
1989 | "last": "Winters"
1990 | },
1991 | "company": "BIFLEX",
1992 | "email": "tamera.winters@biflex.us",
1993 | "phone": "+1 (875) 593-2006",
1994 | "address": "778 Knickerbocker Avenue, Cavalero, Utah, 6781",
1995 | "about": "Eiusmod laborum nisi consectetur laborum culpa excepteur cupidatat incididunt ea aliquip. Pariatur Lorem elit consectetur do deserunt. Veniam voluptate irure sint est consectetur minim occaecat anim aliqua. Proident pariatur cillum id commodo dolore deserunt qui mollit sit occaecat irure Lorem. Nostrud nostrud minim proident ea laborum sit deserunt consequat mollit.\r\n",
1996 | "registered": "Monday, January 6, 2014 6:22 AM",
1997 | "latitude": -64.000389,
1998 | "longitude": 4.937974,
1999 | "tags": [
2000 | "sint",
2001 | "labore",
2002 | "reprehenderit",
2003 | "id",
2004 | "culpa",
2005 | "culpa",
2006 | "voluptate"
2007 | ],
2008 | "range": [
2009 | 0,
2010 | 1,
2011 | 2,
2012 | 3,
2013 | 4,
2014 | 5,
2015 | 6,
2016 | 7,
2017 | 8,
2018 | 9
2019 | ],
2020 | "friends": [
2021 | {
2022 | "id": 0,
2023 | "name": "Mollie William"
2024 | },
2025 | {
2026 | "id": 1,
2027 | "name": "Diana Camacho"
2028 | },
2029 | {
2030 | "id": 2,
2031 | "name": "Sherrie Peterson"
2032 | }
2033 | ],
2034 | "images": [
2035 | {
2036 | "id": "54e1a2042c142cc42bec08f0",
2037 | "format": "",
2038 | "url": "http://ourimageserver/7ffede44-950c-45a7-b8e9-25e647e0fcb6",
2039 | "description": "Aliqua id occaecat incididunt proident mollit culpa cillum mollit sunt enim dolore nulla aliquip irure."
2040 | },
2041 | {
2042 | "id": "54e1a2047fbca3d38fb50e5d",
2043 | "format": "",
2044 | "url": "http://ourimageserver/8fbf9048-1db3-48a6-92ef-1c8a428095a6",
2045 | "description": "Adipisicing exercitation culpa incididunt incididunt."
2046 | },
2047 | {
2048 | "id": "54e1a20467507d9b5a7d5d9f",
2049 | "format": "",
2050 | "url": "http://ourimageserver/88d7cfc6-37c7-4abc-b8ab-64e0c930f134",
2051 | "description": "Est proident velit tempor fugiat dolore magna Lorem culpa."
2052 | },
2053 | {
2054 | "id": "54e1a204ca8570bd0a290f66",
2055 | "format": "",
2056 | "url": "http://ourimageserver/43029c4f-16e6-4db7-b36d-736cd3f9a690",
2057 | "description": "Quis non id consequat velit tempor."
2058 | },
2059 | {
2060 | "id": "54e1a204c1e351d4f447b068",
2061 | "format": "",
2062 | "url": "http://ourimageserver/e3e11a91-114a-436e-814f-ccc9848e1fa0",
2063 | "description": "Sint mollit nulla culpa sint id commodo cillum."
2064 | },
2065 | {
2066 | "id": "54e1a204d72dc6d88af69709",
2067 | "format": "",
2068 | "url": "http://ourimageserver/90eca6b3-278b-4dd3-b1da-a856a6869f74",
2069 | "description": "Quis amet pariatur nostrud mollit ipsum qui nostrud."
2070 | },
2071 | {
2072 | "id": "54e1a204859e109d253bb749",
2073 | "format": "",
2074 | "url": "http://ourimageserver/63f79977-0f2d-4e58-ace9-73b44b01ef6d",
2075 | "description": "Culpa mollit nulla fugiat exercitation ea cillum est nisi consequat voluptate."
2076 | },
2077 | {
2078 | "id": "54e1a204c0cc0b399b638938",
2079 | "format": "",
2080 | "url": "http://ourimageserver/a896eda9-2913-4065-98a8-9de211c2cd5b",
2081 | "description": "Laboris cillum ad consectetur est dolore proident magna dolor aute nostrud irure."
2082 | }
2083 | ],
2084 | "greeting": "Hello, Tamera! You have 6 unread messages.",
2085 | "favorite_fruit": "apple"
2086 | }
2087 | ],
2088 | "status": "success",
2089 | "is_real_json": false
2090 | }
2091 |
--------------------------------------------------------------------------------
/benchmark/src/main/resources/small.bin:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RicardoJiang/json-benchmark/61d5664445f3fe5f5bf16e695454a482e00b98e6/benchmark/src/main/resources/small.bin
--------------------------------------------------------------------------------
/benchmark/src/main/resources/small.json:
--------------------------------------------------------------------------------
1 | {
2 | "users": [
3 | {
4 | "_id": "54e1a2497ec861adfaf279dc",
5 | "index": 0,
6 | "guid": "bb1f1b8b-eeb2-41ea-bcb6-a0fec0118696",
7 | "is_active": false,
8 | "balance": "$3,111.24",
9 | "picture": "http://placehold.it/32x32",
10 | "age": 27,
11 | "eye_color": "green",
12 | "name": {
13 | "first": "Lora",
14 | "last": "Peterson"
15 | },
16 | "company": "ZENTIME",
17 | "email": "lora.peterson@zentime.tv",
18 | "phone": "+1 (846) 533-3429",
19 | "address": "337 Jay Street, Nadine, Alaska, 3511",
20 | "about": "Do id reprehenderit ipsum ullamco nulla cillum. Est cupidatat minim est voluptate pariatur consequat ut aliquip deserunt proident sit officia consectetur tempor. In sunt officia ea elit proident commodo deserunt.\r\n",
21 | "registered": "Monday, October 13, 2014 11:00 AM",
22 | "latitude": -68.438885,
23 | "longitude": 99.273798,
24 | "tags": [
25 | "cupidatat",
26 | "in",
27 | "aliquip",
28 | "occaecat",
29 | "fugiat",
30 | "dolore",
31 | "eu"
32 | ],
33 | "range": [
34 | 0,
35 | 1,
36 | 2,
37 | 3,
38 | 4,
39 | 5,
40 | 6,
41 | 7,
42 | 8,
43 | 9
44 | ],
45 | "friends": [
46 | {
47 | "id": 0,
48 | "name": "Holden Huber"
49 | },
50 | {
51 | "id": 1,
52 | "name": "Perry Dawson"
53 | },
54 | {
55 | "id": 2,
56 | "name": "Santiago Lester"
57 | }
58 | ],
59 | "images": [
60 | {
61 | "id": "54e1a2491c441c02dda9e1a2",
62 | "format": "",
63 | "url": "http://ourimageserver/ff10e184-ad03-49a5-8776-60d69027a85f",
64 | "description": "Quis adipisicing aute exercitation veniam aliquip do laboris dolore esse ipsum."
65 | },
66 | {
67 | "id": "54e1a2499ffbcff833aa697f",
68 | "format": "",
69 | "url": "http://ourimageserver/ee68a15b-beda-4b62-abf1-e051789df5e2",
70 | "description": "Culpa magna cupidatat incididunt laboris labore ex esse."
71 | },
72 | {
73 | "id": "54e1a2494bea0bb68c18f323",
74 | "format": "",
75 | "url": "http://ourimageserver/9039ffd6-65e5-4326-99b8-d0fafadfaf01",
76 | "description": "Et qui ipsum duis nostrud pariatur Lorem aliqua laborum aliqua proident dolor."
77 | },
78 | {
79 | "id": "54e1a2497377f96a7eee39c8",
80 | "format": "",
81 | "url": "http://ourimageserver/a60e8c5d-3cc1-41a0-ba8f-29d427adef8e",
82 | "description": "Ut consectetur eiusmod aute non excepteur irure nostrud eu est consequat amet nulla dolor."
83 | },
84 | {
85 | "id": "54e1a24994f29c027081368c",
86 | "format": "",
87 | "url": "http://ourimageserver/4944823f-684f-4dee-9a99-1d4e663516b7",
88 | "description": "Adipisicing est ex ut velit veniam ut laboris ipsum aute ut enim Lorem sunt."
89 | },
90 | {
91 | "id": "54e1a249d38a45c01e2683df",
92 | "format": "",
93 | "url": "http://ourimageserver/09f13d0e-9659-4897-ac27-db84301f58e1",
94 | "description": "Tempor voluptate nostrud tempor amet ipsum exercitation dolor."
95 | },
96 | {
97 | "id": "54e1a249baf69dd62ce8b44d",
98 | "format": "",
99 | "url": "http://ourimageserver/dfd78293-ac0b-48b7-bf8c-66e2672de3b5",
100 | "description": "Velit ea cillum exercitation deserunt nostrud reprehenderit et occaecat et mollit proident culpa ad."
101 | },
102 | {
103 | "id": "54e1a2499c3d7eea438271fd",
104 | "format": "",
105 | "url": "http://ourimageserver/b7c16d08-40a1-4df8-9499-e7d189d26333",
106 | "description": "Pariatur dolor cupidatat non nulla pariatur adipisicing labore nulla laborum ea."
107 | },
108 | {
109 | "id": "54e1a24994dda9614f6ffcb6",
110 | "format": "",
111 | "url": "http://ourimageserver/d104650f-0546-4cbd-a62b-5be257436f99",
112 | "description": "Voluptate et amet est ad exercitation magna labore commodo id eu in ad."
113 | },
114 | {
115 | "id": "54e1a249b4d394b66e425c95",
116 | "format": "",
117 | "url": "http://ourimageserver/2b35b0f6-655d-4b47-a753-0d9395fdf25b",
118 | "description": "Irure nisi consequat eiusmod quis consectetur nostrud nisi dolore eu proident deserunt."
119 | },
120 | {
121 | "id": "54e1a249ca5c304c909a2de2",
122 | "format": "",
123 | "url": "http://ourimageserver/676ac6bf-1ce7-4529-b544-bab7b663942d",
124 | "description": "Amet officia laboris aliqua officia exercitation sunt mollit."
125 | },
126 | {
127 | "id": "54e1a249727d8bb2963c53dc",
128 | "format": "",
129 | "url": "http://ourimageserver/217d1692-bdb8-4162-9f32-7deeb55d9220",
130 | "description": "Adipisicing ad incididunt duis ullamco Lorem quis qui ipsum laborum."
131 | },
132 | {
133 | "id": "54e1a24979ac053841fe5e58",
134 | "format": "",
135 | "url": "http://ourimageserver/9e8b323d-0e09-4086-a934-38e3aef0a13f",
136 | "description": "Ad excepteur excepteur dolore consectetur do laborum."
137 | }
138 | ],
139 | "greeting": "Hello, Lora! You have 6 unread messages.",
140 | "favorite_fruit": "banana"
141 | },
142 | {
143 | "_id": "54e1a249b907885ff759e7e8",
144 | "index": 1,
145 | "guid": "1d27a869-a26d-4166-922c-b489846906ba",
146 | "is_active": true,
147 | "balance": "$3,489.60",
148 | "picture": "http://placehold.it/32x32",
149 | "age": 21,
150 | "eye_color": "brown",
151 | "name": {
152 | "first": "Davenport",
153 | "last": "Wolfe"
154 | },
155 | "company": "RODEOMAD",
156 | "email": "davenport.wolfe@rodeomad.net",
157 | "phone": "+1 (857) 530-2371",
158 | "address": "457 Lewis Avenue, Linwood, Missouri, 9359",
159 | "about": "Pariatur culpa consectetur et non velit est consequat nostrud qui duis dolore quis. Labore veniam sit est laboris laboris cillum tempor voluptate laboris sit cillum ad. Qui ut nulla ipsum magna non officia aliquip duis pariatur laborum sint deserunt minim velit. Sit aliqua veniam cillum tempor nostrud mollit aliqua excepteur sit. Reprehenderit esse eu eu amet elit laborum ea culpa incididunt id in aliquip. Mollit laborum enim laborum commodo sit magna deserunt deserunt. Nisi sit id ipsum ut id quis pariatur amet.\r\n",
160 | "registered": "Monday, November 10, 2014 6:53 PM",
161 | "latitude": 14.868645,
162 | "longitude": -21.366905,
163 | "tags": [
164 | "do",
165 | "non",
166 | "aliquip",
167 | "irure",
168 | "amet",
169 | "incididunt",
170 | "Lorem"
171 | ],
172 | "range": [
173 | 0,
174 | 1,
175 | 2,
176 | 3,
177 | 4,
178 | 5,
179 | 6,
180 | 7,
181 | 8,
182 | 9
183 | ],
184 | "friends": [
185 | {
186 | "id": 0,
187 | "name": "Audra Perkins"
188 | },
189 | {
190 | "id": 1,
191 | "name": "Cash Cox"
192 | },
193 | {
194 | "id": 2,
195 | "name": "Judy Herring"
196 | }
197 | ],
198 | "images": [
199 | {
200 | "id": "54e1a2499292c61097fe2f48",
201 | "format": "",
202 | "url": "http://ourimageserver/f3a79781-13db-4417-a232-e56b83c8e937",
203 | "description": "Excepteur pariatur fugiat commodo veniam nisi commodo dolore."
204 | },
205 | {
206 | "id": "54e1a2499a198fc52c8015d3",
207 | "format": "",
208 | "url": "http://ourimageserver/79dfd649-8769-4048-a223-04ae4ce966d9",
209 | "description": "Non mollit nulla mollit proident occaecat."
210 | },
211 | {
212 | "id": "54e1a249d6343f73eef71ad3",
213 | "format": "",
214 | "url": "http://ourimageserver/152298f7-151b-40ae-a84f-b780942f5035",
215 | "description": "Id adipisicing est anim duis quis dolor."
216 | }
217 | ],
218 | "greeting": "Hello, Davenport! You have 7 unread messages.",
219 | "favorite_fruit": "banana"
220 | }
221 | ],
222 | "status": "success",
223 | "is_real_json": false
224 | }
225 |
--------------------------------------------------------------------------------
/build.gradle.kts:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 | plugins {
3 | id("com.android.application") version "7.2.1" apply false
4 | id("org.jetbrains.kotlin.android") version "1.8.20" apply false
5 | id("com.android.library") version "7.2.1" apply false
6 | id("androidx.benchmark") version "1.1.1" apply false
7 | id("com.google.devtools.ksp").version("1.8.20-1.0.11")
8 | id("com.kanyun.kudos") version "1.8.20-1.1.0" apply false
9 | }
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. More details, visit
12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
13 | # org.gradle.parallel=true
14 | # AndroidX package structure to make it clearer which packages are bundled with the
15 | # Android operating system, and which are packaged with your app's APK
16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
17 | android.useAndroidX=true
18 | # Kotlin code style for this project: "official" or "obsolete":
19 | kotlin.code.style=official
20 | # Enables namespacing of each library's R class so that its R class includes only the
21 | # resources declared in the library itself and none from the library's dependencies,
22 | # thereby reducing the size of the R class for that library
23 | android.nonTransitiveRClass=true
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/RicardoJiang/json-benchmark/61d5664445f3fe5f5bf16e695454a482e00b98e6/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Mon Oct 02 16:09:16 CST 2023
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
5 | zipStoreBase=GRADLE_USER_HOME
6 | zipStorePath=wrapper/dists
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | #
4 | # Copyright 2015 the original author or authors.
5 | #
6 | # Licensed under the Apache License, Version 2.0 (the "License");
7 | # you may not use this file except in compliance with the License.
8 | # You may obtain a copy of the License at
9 | #
10 | # https://www.apache.org/licenses/LICENSE-2.0
11 | #
12 | # Unless required by applicable law or agreed to in writing, software
13 | # distributed under the License is distributed on an "AS IS" BASIS,
14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | # See the License for the specific language governing permissions and
16 | # limitations under the License.
17 | #
18 |
19 | ##############################################################################
20 | ##
21 | ## Gradle start up script for UN*X
22 | ##
23 | ##############################################################################
24 |
25 | # Attempt to set APP_HOME
26 | # Resolve links: $0 may be a link
27 | PRG="$0"
28 | # Need this for relative symlinks.
29 | while [ -h "$PRG" ] ; do
30 | ls=`ls -ld "$PRG"`
31 | link=`expr "$ls" : '.*-> \(.*\)$'`
32 | if expr "$link" : '/.*' > /dev/null; then
33 | PRG="$link"
34 | else
35 | PRG=`dirname "$PRG"`"/$link"
36 | fi
37 | done
38 | SAVED="`pwd`"
39 | cd "`dirname \"$PRG\"`/" >/dev/null
40 | APP_HOME="`pwd -P`"
41 | cd "$SAVED" >/dev/null
42 |
43 | APP_NAME="Gradle"
44 | APP_BASE_NAME=`basename "$0"`
45 |
46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
48 |
49 | # Use the maximum available, or set MAX_FD != -1 to use that value.
50 | MAX_FD="maximum"
51 |
52 | warn () {
53 | echo "$*"
54 | }
55 |
56 | die () {
57 | echo
58 | echo "$*"
59 | echo
60 | exit 1
61 | }
62 |
63 | # OS specific support (must be 'true' or 'false').
64 | cygwin=false
65 | msys=false
66 | darwin=false
67 | nonstop=false
68 | case "`uname`" in
69 | CYGWIN* )
70 | cygwin=true
71 | ;;
72 | Darwin* )
73 | darwin=true
74 | ;;
75 | MINGW* )
76 | msys=true
77 | ;;
78 | NONSTOP* )
79 | nonstop=true
80 | ;;
81 | esac
82 |
83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
84 |
85 |
86 | # Determine the Java command to use to start the JVM.
87 | if [ -n "$JAVA_HOME" ] ; then
88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
89 | # IBM's JDK on AIX uses strange locations for the executables
90 | JAVACMD="$JAVA_HOME/jre/sh/java"
91 | else
92 | JAVACMD="$JAVA_HOME/bin/java"
93 | fi
94 | if [ ! -x "$JAVACMD" ] ; then
95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
96 |
97 | Please set the JAVA_HOME variable in your environment to match the
98 | location of your Java installation."
99 | fi
100 | else
101 | JAVACMD="java"
102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
103 |
104 | Please set the JAVA_HOME variable in your environment to match the
105 | location of your Java installation."
106 | fi
107 |
108 | # Increase the maximum file descriptors if we can.
109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
110 | MAX_FD_LIMIT=`ulimit -H -n`
111 | if [ $? -eq 0 ] ; then
112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
113 | MAX_FD="$MAX_FD_LIMIT"
114 | fi
115 | ulimit -n $MAX_FD
116 | if [ $? -ne 0 ] ; then
117 | warn "Could not set maximum file descriptor limit: $MAX_FD"
118 | fi
119 | else
120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
121 | fi
122 | fi
123 |
124 | # For Darwin, add options to specify how the application appears in the dock
125 | if $darwin; then
126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
127 | fi
128 |
129 | # For Cygwin or MSYS, switch paths to Windows format before running java
130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
133 |
134 | JAVACMD=`cygpath --unix "$JAVACMD"`
135 |
136 | # We build the pattern for arguments to be converted via cygpath
137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
138 | SEP=""
139 | for dir in $ROOTDIRSRAW ; do
140 | ROOTDIRS="$ROOTDIRS$SEP$dir"
141 | SEP="|"
142 | done
143 | OURCYGPATTERN="(^($ROOTDIRS))"
144 | # Add a user-defined pattern to the cygpath arguments
145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
147 | fi
148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
149 | i=0
150 | for arg in "$@" ; do
151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
153 |
154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
156 | else
157 | eval `echo args$i`="\"$arg\""
158 | fi
159 | i=`expr $i + 1`
160 | done
161 | case $i in
162 | 0) set -- ;;
163 | 1) set -- "$args0" ;;
164 | 2) set -- "$args0" "$args1" ;;
165 | 3) set -- "$args0" "$args1" "$args2" ;;
166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
172 | esac
173 | fi
174 |
175 | # Escape application args
176 | save () {
177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
178 | echo " "
179 | }
180 | APP_ARGS=`save "$@"`
181 |
182 | # Collect all arguments for the java command, following the shell quoting and substitution rules
183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
184 |
185 | exec "$JAVACMD" "$@"
186 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @rem
2 | @rem Copyright 2015 the original author or authors.
3 | @rem
4 | @rem Licensed under the Apache License, Version 2.0 (the "License");
5 | @rem you may not use this file except in compliance with the License.
6 | @rem You may obtain a copy of the License at
7 | @rem
8 | @rem https://www.apache.org/licenses/LICENSE-2.0
9 | @rem
10 | @rem Unless required by applicable law or agreed to in writing, software
11 | @rem distributed under the License is distributed on an "AS IS" BASIS,
12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | @rem See the License for the specific language governing permissions and
14 | @rem limitations under the License.
15 | @rem
16 |
17 | @if "%DEBUG%" == "" @echo off
18 | @rem ##########################################################################
19 | @rem
20 | @rem Gradle startup script for Windows
21 | @rem
22 | @rem ##########################################################################
23 |
24 | @rem Set local scope for the variables with windows NT shell
25 | if "%OS%"=="Windows_NT" setlocal
26 |
27 | set DIRNAME=%~dp0
28 | if "%DIRNAME%" == "" set DIRNAME=.
29 | set APP_BASE_NAME=%~n0
30 | set APP_HOME=%DIRNAME%
31 |
32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter.
33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
34 |
35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
37 |
38 | @rem Find java.exe
39 | if defined JAVA_HOME goto findJavaFromJavaHome
40 |
41 | set JAVA_EXE=java.exe
42 | %JAVA_EXE% -version >NUL 2>&1
43 | if "%ERRORLEVEL%" == "0" goto execute
44 |
45 | echo.
46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
47 | echo.
48 | echo Please set the JAVA_HOME variable in your environment to match the
49 | echo location of your Java installation.
50 |
51 | goto fail
52 |
53 | :findJavaFromJavaHome
54 | set JAVA_HOME=%JAVA_HOME:"=%
55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
56 |
57 | if exist "%JAVA_EXE%" goto execute
58 |
59 | echo.
60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
61 | echo.
62 | echo Please set the JAVA_HOME variable in your environment to match the
63 | echo location of your Java installation.
64 |
65 | goto fail
66 |
67 | :execute
68 | @rem Setup the command line
69 |
70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
71 |
72 |
73 | @rem Execute Gradle
74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
75 |
76 | :end
77 | @rem End local scope for the variables with windows NT shell
78 | if "%ERRORLEVEL%"=="0" goto mainEnd
79 |
80 | :fail
81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
82 | rem the _cmd.exe /c_ return code!
83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
84 | exit /b 1
85 |
86 | :mainEnd
87 | if "%OS%"=="Windows_NT" endlocal
88 |
89 | :omega
90 |
--------------------------------------------------------------------------------
/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | repositories {
3 | mavenLocal()
4 | google()
5 | mavenCentral()
6 | gradlePluginPortal()
7 | }
8 | }
9 | dependencyResolutionManagement {
10 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
11 | repositories {
12 | mavenLocal()
13 | google()
14 | mavenCentral()
15 | }
16 | }
17 |
18 | rootProject.name = "json-benchmark"
19 | include(":app")
20 | include(":benchmark")
21 |
--------------------------------------------------------------------------------