# schemaorg-java **Repository Path**: mirrors_google/schemaorg-java ## Basic Information - **Project Name**: schemaorg-java - **Description**: Java utilities for working with Schema.org data in JSON-LD format - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-08-08 - **Last Updated**: 2026-03-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Schema.org Client Library for Java - [Overview](#Overview) - [Highlighted Features](#Highlighted_Features) - [Quick Start](#Quick_Start) - [Important Usage Notes](#Important_Usage_Notes) - [Example Code](#Example_Code) - [Dependencies](#Dependencies) - [Links](#Links) ## Overview The Schema.org Client Library for Java is a library for creating [schema.org](http://schema.org) entities. The entities can be easily serialized and deserialized with [JSON-LD](https://json-ld.org) format by using the JSON-LD serializer in the library. Note that it is based on a 2016 release snapshot of Schema.org, and is *not currently actively being developed*. If you are interested to see updates (e.g. for Schema.org 3.4 or later), please comment in [Issue #7](https://github.com/google/schemaorg-java/issues/7). ## Library Highlights The library has the following highlights: * Fully supports the vocabulary defined in the http://schema.org namespace as well as vocabulary defined in the http://schema.googleapis.com namespace. * Fully supports type multiple inheritance, multiple values per property in schema.org. * Every schema.org type has a corresponding Java interface which provides convenient setter methods for setting the values of the properties of that particular type. * Supports serializing and deserializing schema.org objects to and from JSON-LD formats. ## Limitations * The library is based on code generated from a specific [release](https://schema.org/docs/releases.html) of schema.org. It may not support more recent additions and changes, or third party extensions. ## Quick Start Below is a simple example of creating schema.org [Thing](http://schema.org/Thing) object, serialize it into JSON-LD format and deserialize JSON-LD back to a Thing object. ```java JsonLdSerializer serializer = new JsonLdSerializer(true /* setPrettyPrinting */); Thing object = CoreFactory.newThingBuilder() .addUrl("http://example.com") .addName("John") .addProperty("customPropertyName", "customPropertyValue") .build(); try { String jsonLdStr = serializer.serialize(object); List list = serializer.deserialize(jsonLdStr); Thing thing = list.get(0); String name = ((Text) thing.getNameList().get(0)).getValue(); String customPropertyValue = ((Text) thing.getProperty("customPropertyName").get(0)).getValue(); } catch (JsonLdSyntaxException e) { // Errors related to JSON-LD format and schema.org terms in JSON-LD } catch (JsonIOException e) { // Errors related to JSON format } ``` ## Important Usage Notes Some important usage recommendations are given below: ### Package Structure The Java Classes are organized into the following pakcages: * `com.google.schemaorg` (basic interfaces and JSON-LD serializer) * `com.google.schemaorg.core` (library for http://schema.org namespace vocabulary) * `com.google.schemaorg.core.datatype` ([DataType](http://schema.org/DataType) primitives) * `com.google.schemaorg.goog` (library for http://schema.googleapis.com namespace vocabulary) ### Builders In the Java library, every schema.org type has a corresponding Java interface with the same name as the schema.org type. The Java interfaces are designed with the [Builder Pattern](https://en.wikipedia.org/wiki/Builder_pattern). Developers don't need to know any details about implementation of these interfaces, because all the operations on the object will be performed through the interface. `CoreFactory` and `GoogFactory` classes provide static factory methods that return a Builder object for a specific schema.org type. In the builder interfaces, there are `add[PropertyName]` methods for each property which could be set in the corresponding schema.org type. Multiple values can be added to a property as documented by schema.org. The `build()` method should be called to create an immutable concrete instance of that type. A `get[PropertyName]List` method is defined for each property. The `get[PropertyName]List` method will return an [`ImmutableList`] (https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/ImmutableList.html) containing all the values for the specific property. In order to add any custom property into any schema.org type, the `addProperty` and `getProperty` methods are defined in the interface for each schema.org type. ### DataType [DataType](https://schema.org/DataType) is defined in the package `com.google.schemaorg.core.datatype`. To create a primitive DataType object, the static method `of()` in each type should be used. For example: * Text.of("help") * URL.of("http://schema.org") * Time.of("08:32") * Date.of("2016-01-28") * DateTime.of("2016-01-28 12:00") * Number.of("42") * Integer.of(42) * Float.of(3.14) * Boolean has limited possible values of `True` and `False`. It is defined as an enum type in this library. `Boolean` is the interface and it has 2 enum values: `BooleanEnum.TRUE` and `BooleanEnum.FALSE`. ### Enumeration Subtypes of [Enumeration](https://schema.org/Enumeration) are handled slightly differently. For each Enumeration subtype in schema.org, a Java interface is created which provides accessor methods for the properties of that type. The name of the interface is the same name as the schema.org type. In addition, a Java Enum class is also created to hold the enum values of that schema.org Enumeration type. The name of the Enum class is type name with `Enum` appended. For example, [ActionStatusType](http://schema.org/ActionStatusType) is a subtype of [Enumeration](http://schema.org/Enumeration) in schema.org. It has the following values: * ActiveActionStatus * CompletedActionStatus * FailedActionStatus * PotentialActionStatus In the Java library, an interface named `ActionStatusType` is defined and a Java Enum class named `ActionStatusTypeEnum` is defined which implements the `ActionStatusType` interface. The `ActionStatusTypeEnum` contains the following enum values: * `ACTIVE_ACTION_STATUS` * `COMPLETED_ACTION_STATUS` * `FAILED_ACTION_STATUS` * `POTENTIAL_ACTION_STATUS` ### JSON-LD All the schema.org type builders also support setting the values for JSON-LD keywords. Following methods are defined in the builder interface: * `addJsonLdContext` (Adds the [@context] (https://www.w3.org/TR/json-ld/#the-context) with a `JsonLdContext`. The [@base](https://www.w3.org/TR/json-ld/#base-iri) could be set by building a `JsonLdContext` using `JsonLdFactory.newContextBuilder()`. Examples can be found in [Example Code](#Example_Code). More JSON-LD keywords and custom term definition will be supported in future release.) * `setJsonLdId` (Sets the [@id] (https://www.w3.org/TR/json-ld/#node-identifiers) with the given string value.) * `setJsonLdReverse` (Sets the [@reverse] (https://www.w3.org/TR/json-ld/#reverse-properties) relationship between the current entity and the target entity.) * The JSON-LD serializer is able to determine appropriate `@context` url automatically based on serialized objects. So users don't need to explicitly set the `@context` URL. ## Example Code ### Serialization ```java JsonLdSerializer serializer = new JsonLdSerializer(true /* setPrettyPrinting */); DataFeed object = CoreFactory.newDataFeedBuilder() .addJsonLdContext( JsonLdFactory.newContextBuilder() .setBase("http://example.com/") .build()) .addDataFeedElement( CoreFactory.newRecipeBuilder() .setJsonLdId("123456") .addName("recipe name") .addAuthor(CoreFactory.newPersonBuilder().addName("John Smith").build()) .addIsFamilyFriendly(BooleanEnum.TRUE) .setJsonLdReverse( CoreConstants.PROPERTY_RECIPE, CoreFactory.newCookActionBuilder().setJsonLdId("54321").build()) .build()) .build(); try { String jsonLdStr = serializer.serialize(object); } catch (JsonLdSyntaxException e) { // Errors related to JSON-LD format and schema.org terms in JSON-LD } catch (JsonIOException e) { // Errors related to JSON format } ``` Every addXXX() method that takes the immutable class built from the builder class also has an overloaded convenience method that takes the builder class itself as shown below: ```java JsonLdSerializer serializer = new JsonLdSerializer(true /* setPrettyPrinting */); DataFeed object = CoreFactory.newDataFeedBuilder() .addJsonLdContext( JsonLdFactory.newContextBuilder() .setBase("http://example.com/")) .addDataFeedElement( CoreFactory.newRecipeBuilder() .setJsonLdId("123456") .addName("recipe name") .addAuthor(CoreFactory.newPersonBuilder().addName("John Smith")) .addIsFamilyFriendly(BooleanEnum.TRUE) .setJsonLdReverse( CoreConstants.PROPERTY_RECIPE, CoreFactory.newCookActionBuilder().setJsonLdId("54321")) .build(); try { String jsonLdStr = serializer.serialize(object); } catch (JsonLdSyntaxException e) { // Errors related to JSON-LD format and schema.org terms in JSON-LD } catch (JsonIOException e) { // Errors related to JSON format } ``` Multiple schema.org objects can be serialized by calling the overloaded method `serialize(List objects)`. ### Deserialization ```java JsonLdSerializer serializer = new JsonLdSerializer(true /* setPrettyPrinting */); String jsonLd = "{\n" + " \"@context\": [\n" + " \"http://schema.org/\",\n" + " {\n" + " \"@base\": \"http://example.com/\"\n" + " }\n" + " ],\n" + " \"@type\": \"DataFeed\",\n" + " \"dataFeedElement\": {\n" + " \"@type\": \"Recipe\",\n" + " \"@id\": \"123456\",\n" + " \"name\": \"recipe name\",\n" + " \"author\": {\n" + " \"@type\": \"Person\",\n" + " \"name\": \"ABC DEF\"\n" + " },\n" + " \"isFamilyFriendly\": \"http://schema.org/True\",\n" + " \"@reverse\": {\n" + " \"recipe\": {\n" + " \"@type\": \"CookAction\",\n" + " \"@id\": \"54321\"\n" + " }\n" + " }\n" + " }\n" + "}"; try { List actual = serializer.deserialize(jsonLd); if ("http://schema.org/DataFeed".equals(actual.get(0).getFullTypeName()) { DataFeed dataFeed = (DataFeed) actual.get(0); List contexts = dataFeed.getJsonLdContextList(); String url = ((JsonLdContext) contexts.get(0)).getUrl(); String goog = ((JsonLdContext) contexts.get(1)).getTerm("goog"); Recipe recipe = (Recipe) (dataFeed.getDataFeedElementList().get(0)); String id = recipe.getJsonLdId(); String recipeName = ((Text) recipe.getNameList().get(0)).getValue(); } } catch (JsonLdSyntaxException e) { // Errors related to JSON-LD format and schema.org terms in JSON-LD } catch (JsonIOException e) { // Errors related to JSON format } ``` Limitations of current JSON-LD deserialization are given below: * Every JSON-LD entity should have a `@type`. Its value must be a full schema.org type name (e.g. "http://schema.org/Thing") or a short type name (e.g. "Thing"). * The parser supports only http://schema.org and http://schema.googleapis.com terms. It assumes the context is always "http://schema.org" or "http://schema.googleapis.com". And all relative IRIs are resolved relative to "http://schema.org/" or "http://schema.googleapis.com/". * The parser doesn't support [compact IRI] (https://www.w3.org/TR/json-ld/#compact-iris). * The JSON-LD format does not contain sufficient information to determine the exact subtype of the `DataType` hierarchy. The parser does not currently understand the [coercion rule] (https://www.w3.org/TR/json-ld/#type-coercion). Therefore, all numerical values are parsed on a best-effort basis to the numerical type that the property accepts. All text values are parsed to be `com.google.schemaorg.core.datatype.Text`. You should not expect to see other types such as `URL`, `Date`, `Time`, `DateTime`, etc.. Future versions of this client library may remove these limitations. ## Dependencies This library depends on following public libraries: * [Google Gson](https://github.com/google/gson) * [Google Core Libraries for Java](https://github.com/google/guava) * [JSR 305](http://mvnrepository.com/artifact/com.google.code.findbugs/jsr305) To add dependency using [Gradle](https://docs.gradle.org/current/userguide/userguide.html): * Use remote repository ``` repositories { mavenCentral() } dependencies { compile 'com.google.code.findbugs:jsr305:3.0.1' compile 'com.google.guava:guava:19.0' compile 'com.google.code.gson:gson:2.5' compile files('schema-org-client-1.0.0/schema-org-client-1.0.0.jar') } ``` * Use local files ``` dependencies { compile fileTree(dir: 'schema-org-client-1.0.0/lib', include: '*.jar') compile files('schema-org-client-1.0.0/schema-org-client-1.0.0.jar') } ``` ## Links - [schema.org](https://schema.org/) - [JSON-LD](https://json-ld.org)