{"id":22330465,"url":"https://github.com/javadev/underscore-java","last_synced_at":"2025-04-12T01:02:48.557Z","repository":{"id":15524884,"uuid":"18259368","full_name":"javadev/underscore-java","owner":"javadev","description":"java port of Underscore.js","archived":false,"fork":false,"pushed_at":"2025-04-09T08:05:23.000Z","size":9795,"stargazers_count":537,"open_issues_count":1,"forks_count":80,"subscribers_count":14,"default_branch":"main","last_synced_at":"2025-04-12T01:02:37.143Z","etag":null,"topics":["functional-programming","java","java-xmlbuilder","javascript","json","json-to-xml","json-to-xml-converter","json-to-xml-java","underscore","xml","xml-to-json","xml-to-json-java","xmlbuilder"],"latest_commit_sha":null,"homepage":"https://javadev.github.io/underscore-java/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/javadev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null},"funding":{"github":["javadev"]}},"created_at":"2014-03-30T07:04:37.000Z","updated_at":"2025-04-09T08:05:25.000Z","dependencies_parsed_at":"2023-10-01T07:37:04.163Z","dependency_job_id":"aa73ceb7-f413-490e-b3b3-6d24f57b7039","html_url":"https://github.com/javadev/underscore-java","commit_stats":null,"previous_names":[],"tags_count":111,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javadev%2Funderscore-java","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javadev%2Funderscore-java/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javadev%2Funderscore-java/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javadev%2Funderscore-java/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/javadev","download_url":"https://codeload.github.com/javadev/underscore-java/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248501871,"owners_count":21114683,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["functional-programming","java","java-xmlbuilder","javascript","json","json-to-xml","json-to-xml-converter","json-to-xml-java","underscore","xml","xml-to-json","xml-to-json-java","xmlbuilder"],"created_at":"2024-12-04T04:06:57.348Z","updated_at":"2025-04-12T01:02:48.532Z","avatar_url":"https://github.com/javadev.png","language":"Java","readme":"\u003cimg src=\"underscore-logo.png\" alt=\"drawing\" width=\"220\" align = \"right\"/\u003e\n\nunderscore-java \n===============\n\n[![Maven Central](https://img.shields.io/maven-central/v/com.github.javadev/underscore.svg)](https://central.sonatype.com/artifact/com.github.javadev/underscore/1.112)\n[![MIT License](http://img.shields.io/badge/license-MIT-green.svg)](https://github.com/javadev/underscore-java/blob/main/LICENSE)\n[![Java CI](https://github.com/javadev/underscore-java/actions/workflows/maven.yml/badge.svg)](https://github.com/javadev/underscore-java/actions/workflows/maven.yml)\n[![CodeQL](https://github.com/javadev/underscore-java/actions/workflows/codeql.yml/badge.svg)](https://github.com/javadev/underscore-java/actions/workflows/codeql.yml)\n[![Semgrep](https://github.com/javadev/underscore-java/actions/workflows/semgrep.yml/badge.svg)](https://github.com/javadev/underscore-java/actions/workflows/semgrep.yml)\n[![Scorecard supply-chain security](https://github.com/javadev/underscore-java/actions/workflows/scorecard.yml/badge.svg?branch=main)](https://github.com/javadev/underscore-java/actions/workflows/scorecard.yml)\n[![OSSAR](https://github.com/javadev/underscore-java/actions/workflows/ossar.yml/badge.svg?branch=main)](https://github.com/javadev/underscore-java/actions/workflows/ossar.yml)\n[![OpenSSF Best Practices](https://bestpractices.coreinfrastructure.org/projects/7019/badge)](https://bestpractices.coreinfrastructure.org/projects/7019)\n[![Coverage Status](https://coveralls.io/repos/javadev/underscore-java/badge.svg?branch=main)](https://coveralls.io/r/javadev/underscore-java)\n[![codecov](https://codecov.io/gh/javadev/underscore-java/branch/master/graph/badge.svg?token=IZXYx3kg5y)](https://codecov.io/gh/javadev/underscore-java)\n[![CircleCI](https://circleci.com/gh/javadev/underscore-java.svg?style=svg)](https://circleci.com/gh/javadev/underscore-java)\n[![Build status](https://ci.appveyor.com/api/projects/status/tx7icv3i08qowv6r?svg=true)](https://ci.appveyor.com/project/javadev/underscore-java)\n[![Build Status](https://javadev.semaphoreci.com/badges/underscore-java/branches/main.svg?key=bb2652ef-e776-4a3e-bbcb-6b4d0c8a805a)](https://javadev.semaphoreci.com/projects/underscore-java)\n[![Known Vulnerabilities](https://snyk.io/test/github/javadev/underscore-java/badge.svg?targetFile=pom.xml)](https://snyk.io/test/github/javadev/underscore-java?targetFile=pom.xml)\n[![javadoc](https://javadoc.io/badge2/com.github.javadev/underscore/javadoc.svg)](https://javadoc.io/doc/com.github.javadev/underscore)\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=javadev_underscore-java\u0026metric=alert_status)](https://sonarcloud.io/summary/overall?id=javadev_underscore-java)\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=javadev_underscore-java\u0026metric=sqale_rating)](https://sonarcloud.io/summary/overall?id=javadev_underscore-java)\n[![Build Status](https://dev.azure.com/javadevazure/underscore-java/_apis/build/status/javadev.underscore-java?branchName=main)](https://dev.azure.com/javadevazure/underscore-java/_build/latest?definitionId=1\u0026branchName=main)\n[![Hits-of-Code](https://hitsofcode.com/github/javadev/underscore-java?branch=main)](https://hitsofcode.com/github/javadev/underscore-java/view?branch=main)\n[![codebeat badge](https://codebeat.co/badges/1060a230-7634-4ae1-94bf-bd2d659bb9c3)](https://codebeat.co/projects/github-com-javadev-underscore-java-main)\n![Java Version](https://img.shields.io/badge/java-%3E%3D%2011-success)\n[![](https://img.shields.io/github/stars/javadev/underscore-java?style=flat-square)](https://github.com/javadev/underscore-java)\n[![](https://img.shields.io/github/forks/javadev/underscore-java?style=flat-square)](https://github.com/javadev/underscore-java/fork)\n\n[![Join the chat at https://gitter.im/javadev/underscore-java](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/javadev/underscore-java?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n\nRequirements\n============\n\nJava 11 and later, [Java 17](https://github.com/javadev/underscore-java17) or [Kotlin](https://github.com/kotlindev/underscore-kotlin)\n\n## Installation\n\nTo configure your Maven project, add the following code to your pom.xml file:\n\n```xml\n\u003cdependencies\u003e\n  \u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.javadev\u003c/groupId\u003e\n    \u003cartifactId\u003eunderscore\u003c/artifactId\u003e\n    \u003cversion\u003e1.112\u003c/version\u003e\n  \u003c/dependency\u003e\n  ...\n\u003c/dependencies\u003e\n```\n\nGradle configuration:\n\n```groovy\nimplementation 'com.github.javadev:underscore:1.112'\n```\n\n### Usage\n\n```java\nU.of(/* array | list | set | map | anything based on Iterable interface */)\n    .filter(..)\n    .map(..)\n    ...\n    .sortWith()\n    .forEach(..);\nU.of(value1, value2, value3)...\nU.range(0, 10)...\n\nU.of(1, 2, 3) // or java.util.Arrays.asList(1, 2, 3) or new Integer[] {1, 2, 3}\n    .filter(v -\u003e v \u003e 1)\n    // 2, 3\n    .map(v -\u003e v + 1)\n    // 3, 4\n    .sortWith((a, b) -\u003e b.compareTo(a))\n    .forEach(System.out::println);\n    // 4, 3\n    \nU.of(1, 2, 3) // or java.util.Arrays.asList(1, 2, 3) or new Integer[] {1, 2, 3}\n    .mapMulti((num, consumer) -\u003e {\n        for (int i = 0; i \u003c num; i++) {\n            consumer.accept(\"a\" + num);\n        }\n    })\n    .forEach(System.out::println);\n    // \"a1\", \"a2\", \"a2\", \"a3\", \"a3\", \"a3\"\n\nU.formatXml(\"\u003ca\u003e\u003cb\u003edata\u003c/b\u003e\u003c/a\u003e\", Xml.XmlStringBuilder.Step.TWO_SPACES);\n    // \u003ca\u003e\n    //   \u003cb\u003edata\u003c/b\u003e\n    // \u003c/a\u003e\n\nU.formatJson(\"{\\\"a\\\":{\\\"b\\\":\\\"data\\\"}}\", Json.JsonStringBuilder.Step.TWO_SPACES);\n    // {\n    //   \"a\": {\n    //     \"b\": \"data\"\n    //   }\n    // }\n\nU.xmlToJson(\n    \"\u003cmydocument has=\\\"an attribute\\\"\u003e\\n\"\n        + \"   \u003cand\u003e\\n\"\n        + \"   \u003cmany\u003eelements\u003c/many\u003e\\n\"\n        + \"    \u003cmany\u003emore elements\u003c/many\u003e\\n\"\n        + \"   \u003c/and\u003e\\n\"\n        + \"   \u003cplus a=\\\"complex\\\"\u003e\\n\"\n        + \"     element as well\\n\"\n        + \"   \u003c/plus\u003e\\n\"\n        + \"\u003c/mydocument\u003e\",\n    Json.JsonStringBuilder.Step.TWO_SPACES);\n    // {\n    //   \"mydocument\": {\n    //     \"-has\": \"an attribute\",\n    //     \"and\": {\n    //       \"many\": [\n    //         \"elements\",\n    //         \"more elements\"\n    //       ]\n    //     },\n    //     \"plus\": {\n    //       \"-a\": \"complex\",\n    //       \"#text\": \"\\n     element as well\\n   \"\n    //     }\n    //   },\n    //   \"#omit-xml-declaration\": \"yes\"\n    // }\n\nU.xmlToJsonMinimum(\n    \"\u003cdata\u003e\\n\"\n        + \"    \u003cstring\u003eExample Text\u003c/string\u003e\\n\"\n        + \"    \u003cinteger\u003e42\u003c/integer\u003e\\n\"\n        + \"    \u003cfloat\u003e3.14\u003c/float\u003e\\n\"\n        + \"    \u003cboolean\u003etrue\u003c/boolean\u003e\\n\"\n        + \"    \u003cdate\u003e2025-02-26\u003c/date\u003e\\n\"\n        + \"    \u003ctime\u003e14:30:00\u003c/time\u003e\\n\"\n        + \"    \u003cdatetime\u003e2025-02-26T14:30:00Z\u003c/datetime\u003e\\n\"\n        + \"    \u003carray\u003eItem 1\u003c/array\u003e\\n\"\n        + \"    \u003carray\u003eItem 2\u003c/array\u003e\\n\"\n        + \"    \u003cobject\u003e\\n\"\n        + \"        \u003ckey1\u003eValue 1\u003c/key1\u003e\\n\"\n        + \"        \u003ckey2\u003eValue 2\u003c/key2\u003e\\n\"\n        + \"    \u003c/object\u003e\\n\"\n        + \"    \u003cnull/\u003e\\n\"\n        + \"\u003c/data\u003e\\n\",\n    Json.JsonStringBuilder.Step.TWO_SPACES);\n    // {\n    //   \"data\": {\n    //     \"string\": \"Example Text\",\n    //     \"integer\": \"42\",\n    //     \"float\": \"3.14\",\n    //     \"boolean\": \"true\",\n    //     \"date\": \"2025-02-26\",\n    //     \"time\": \"14:30:00\",\n    //     \"datetime\": \"2025-02-26T14:30:00Z\",\n    //     \"array\": [\n    //       \"Item 1\",\n    //       \"Item 2\"\n    //     ],\n    //     \"object\": {\n    //       \"key1\": \"Value 1\",\n    //       \"key2\": \"Value 2\"\n    //     },\n    //     \"null\": \"\"\n    //   }\n    // }\n\nU.jsonToXml(\n    \"{\\n\"\n        + \"  \\\"mydocument\\\": {\\n\"\n        + \"    \\\"-has\\\": \\\"an attribute\\\",\\n\"\n        + \"    \\\"and\\\": {\\n\"\n        + \"      \\\"many\\\": [\\n\"\n        + \"        \\\"elements\\\",\\n\"\n        + \"        \\\"more elements\\\"\\n\"\n        + \"      ]\\n\"\n        + \"    },\\n\"\n        + \"    \\\"plus\\\": {\\n\"\n        + \"      \\\"-a\\\": \\\"complex\\\",\\n\"\n        + \"      \\\"#text\\\": \\\"\\\\n     element as well\\\\n   \\\"\\n\"\n        + \"    }\\n\"\n        + \"  },\\n\"\n        + \"  \\\"#omit-xml-declaration\\\": \\\"yes\\\"\\n\"\n        + \"}\",\n    Xml.XmlStringBuilder.Step.TWO_SPACES);\n    // \u003cmydocument has=\"an attribute\"\u003e\n    //   \u003cand\u003e\n    //     \u003cmany\u003eelements\u003c/many\u003e\n    //     \u003cmany\u003emore elements\u003c/many\u003e\n    //   \u003c/and\u003e\n    //   \u003cplus a=\"complex\"\u003e\n    //      element as well\n    //    \u003c/plus\u003e\n    // \u003c/mydocument\u003e\n\nU.jsonToXmlMinimum(\n    \"{\\n\"\n        + \"  \\\"data\\\": {\\n\"\n        + \"    \\\"string\\\": \\\"Example Text\\\",\\n\"\n        + \"    \\\"integer\\\": \\\"42\\\",\\n\"\n        + \"    \\\"float\\\": \\\"3.14\\\",\\n\"\n        + \"    \\\"boolean\\\": \\\"true\\\",\\n\"\n        + \"    \\\"date\\\": \\\"2025-02-26\\\",\\n\"\n        + \"    \\\"time\\\": \\\"14:30:00\\\",\\n\"\n        + \"    \\\"datetime\\\": \\\"2025-02-26T14:30:00Z\\\",\\n\"\n        + \"    \\\"array\\\": [\\n\"\n        + \"      \\\"Item 1\\\",\\n\"\n        + \"      \\\"Item 2\\\"\\n\"\n        + \"    ],\\n\"\n        + \"    \\\"object\\\": {\\n\"\n        + \"      \\\"key1\\\": \\\"Value 1\\\",\\n\"\n        + \"      \\\"key2\\\": \\\"Value 2\\\"\\n\"\n        + \"    },\\n\"\n        + \"    \\\"null\\\": \\\"\\\"\\n\"\n        + \"  }\\n\"\n        + \"}\",\n    Xml.XmlStringBuilder.Step.TWO_SPACES);\n    // \u003cdata\u003e\n    //   \u003cstring\u003eExample Text\u003c/string\u003e\n    //   \u003cinteger\u003e42\u003c/integer\u003e\n    //   \u003cfloat\u003e3.14\u003c/float\u003e\n    //   \u003cboolean\u003etrue\u003c/boolean\u003e\n    //   \u003cdate\u003e2025-02-26\u003c/date\u003e\n    //   \u003ctime\u003e14:30:00\u003c/time\u003e\n    //   \u003cdatetime\u003e2025-02-26T14:30:00Z\u003c/datetime\u003e\n    //   \u003carray\u003eItem 1\u003c/array\u003e\n    //   \u003carray\u003eItem 2\u003c/array\u003e\n    //   \u003cobject\u003e\n    //     \u003ckey1\u003eValue 1\u003c/key1\u003e\n    //     \u003ckey2\u003eValue 2\u003c/key2\u003e\n    //   \u003c/object\u003e\n    //   \u003cnull string=\"true\"/\u003e\n    // \u003c/data\u003e\n\nU.Builder builder = U.objectBuilder()\n    .add(\"firstName\", \"John\")\n    .add(\"lastName\", \"Smith\")\n    .add(\"age\", 25)\n    .add(\"address\", U.arrayBuilder()\n        .add(U.objectBuilder()\n            .add(\"streetAddress\", \"21 2nd Street\")\n            .add(\"city\", \"New York\")\n            .addNull(\"cityId\")\n            .add(\"state\", \"NY\")\n            .add(\"postalCode\", \"10021\")))\n    .add(\"phoneNumber\", U.arrayBuilder()\n        .add(U.objectBuilder()\n            .add(\"type\", \"home\")\n            .add(\"number\", \"212 555-1234\"))\n        .add(U.objectBuilder()\n            .add(\"type\", \"fax\")\n            .add(\"number\", \"646 555-4567\")));\nSystem.out.println(builder.toJson());\nSystem.out.println(builder.toXml());\n```\n```javascript\n{\n  \"firstName\": \"John\",\n  \"lastName\": \"Smith\",\n  \"age\": 25,\n  \"address\": [\n    {\n      \"streetAddress\": \"21 2nd Street\",\n      \"city\": \"New York\",\n      \"cityId\": null,\n      \"state\": \"NY\",\n      \"postalCode\": \"10021\"\n    }\n  ],\n  \"phoneNumber\": [\n    {\n      \"type\": \"home\",\n      \"number\": \"212 555-1234\"\n    },\n    {\n      \"type\": \"fax\",\n      \"number\": \"646 555-4567\"\n    }\n  ]\n}\n```\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003croot\u003e\n  \u003cfirstName\u003eJohn\u003c/firstName\u003e\n  \u003clastName\u003eSmith\u003c/lastName\u003e\n  \u003cage number=\"true\"\u003e25\u003c/age\u003e\n  \u003caddress array=\"true\"\u003e\n    \u003cstreetAddress\u003e21 2nd Street\u003c/streetAddress\u003e\n    \u003ccity\u003eNew York\u003c/city\u003e\n    \u003ccityId null=\"true\"/\u003e\n    \u003cstate\u003eNY\u003c/state\u003e\n    \u003cpostalCode\u003e10021\u003c/postalCode\u003e\n  \u003c/address\u003e\n  \u003cphoneNumber\u003e\n    \u003ctype\u003ehome\u003c/type\u003e\n    \u003cnumber\u003e212 555-1234\u003c/number\u003e\n  \u003c/phoneNumber\u003e\n  \u003cphoneNumber\u003e\n    \u003ctype\u003efax\u003c/type\u003e\n    \u003cnumber\u003e646 555-4567\u003c/number\u003e\n  \u003c/phoneNumber\u003e\n\u003c/root\u003e\n```\n\nSimplify XML document creation by structuring your code like the final document.\n\nThis code:\n\n```java\nXmlBuilder builder = XmlBuilder.create(\"Projects\")\n    .e(\"underscore-java\").a(\"language\", \"Java\").a(\"scm\", \"SVN\")\n        .e(\"Location\").a(\"type\", \"URL\")\n            .t(\"https://github.com/javadev/underscore-java/\")\n        .up()\n    .up()\n    .e(\"JetS3t\").a(\"language\", \"Java\").a(\"scm\", \"CVS\")\n        .e(\"Location\").a(\"type\", \"URL\")\n            .t(\"https://jets3t.s3.amazonaws.com/index.html\");\nSystem.out.println(builder.toXml(Xml.XmlStringBuilder.Step.TWO_SPACES));\nSystem.out.println(builder.toJson(Json.JsonStringBuilder.Step.TWO_SPACES));\n```\n\nGenerates the following XML and JSON documents:\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cProjects\u003e\n    \u003cunderscore-java language=\"Java\" scm=\"SVN\"\u003e\n        \u003cLocation type=\"URL\"\u003ehttps://github.com/javadev/underscore-java/\u003c/Location\u003e\n    \u003c/underscore-java\u003e\n    \u003cJetS3t language=\"Java\" scm=\"CVS\"\u003e\n        \u003cLocation type=\"URL\"\u003ehttps://jets3t.s3.amazonaws.com/index.html\u003c/Location\u003e\n    \u003c/JetS3t\u003e\n\u003c/Projects\u003e\n```\n```json\n{\n  \"Projects\": {\n    \"underscore-java\": {\n      \"-language\": \"Java\",\n      \"-scm\": \"SVN\",\n      \"Location\": {\n        \"-type\": \"URL\",\n        \"#text\": \"https://github.com/javadev/underscore-java/\"\n      }\n    },\n    \"JetS3t\": {\n      \"-language\": \"Java\",\n      \"-scm\": \"CVS\",\n      \"Location\": {\n        \"-type\": \"URL\",\n        \"#text\": \"https://jets3t.s3.amazonaws.com/index.html\"\n      }\n    }\n  }\n}\n```\n\nUnderscore-java is a java port of [Underscore.js](https://underscorejs.org/).\n\nIn addition to porting Underscore's functionality, Underscore-java includes matching unit tests.\n\nFor docs, license, tests, and downloads, see:\nhttps://javadev.github.io/underscore-java\n\nThanks to Jeremy Ashkenas and all contributors to Underscore.js.\n","funding_links":["https://github.com/sponsors/javadev"],"categories":["Projects","项目","I. Development"],"sub_categories":["Utility","实用程序","6. Useful libraries"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjavadev%2Funderscore-java","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjavadev%2Funderscore-java","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjavadev%2Funderscore-java/lists"}