fun.freechat.client.JSON Maven / Gradle / Ivy
/*
* FreeChat OpenAPI Definition
* # FreeChat: Create Some Friends for Yourself with AI English | [中文版](https://github.com/freechat-fun/freechat/blob/main/README.zh-CN.md) ## Introduction Welcome! FreeChat aims to build a cloud-native, robust, and quickly commercializable enterprise-level AI virtual character platform. It also serves as a prompt engineering platform. ## Features - Primarily uses Java and emphasizes **security, robustness, scalability, traceability, and maintainability**. - Boasts **account systems and permission management**, supporting OAuth2 authentication. Introduces the \"organization\" concept and related permission constraint functions. - Extensively employs distributed technologies and caching to support **high concurrency** access. - Provides flexible character customization options, supports direct intervention in prompts, and supports **configuring multiple backends for each character**. - **Offers a comprehensive range of Open APIs**, with more than 180 interfaces and provides java/python/typescript SDKs. These interfaces enable easy construction of systems for end-users. - Supports setting **RAG** (Retrieval Augmented Generation) for characters. - Supports **long-term memory, preset memory** for characters. - Supports characters evoking **proactive chat**. - Supports setting **quota limits** for characters. - Supports characters **importing and exporting**. - Supports individual **debugging and sharing prompts**. ## Snapshots ### On PC #### Home Page ![Home Page Snapshot](/img/snapshot_w1.jpg) #### Development View ![Development View Snapshot](/img/snapshot_w2.jpg) #### Chat View ![Chat View Snapshot](/img/snapshot_w3.jpg) ### On Mobile ![Chat Snapshot 1](/img/snapshot_m1.jpg) ![Chat Snapshot 2](/img/snapshot_m2.jpg)
![Chat Snapshot 3](/img/snapshot_m3.jpg) ![Chat Snapshot 4](/img/snapshot_m4.jpg) ## Character Design ```mermaid flowchart TD A(Character) --> B(Profile) A --> C(Knowledge/RAG) A --> D(Album) A --> E(Backend-1) A --> F(Backend-n...) E --> G(Message Window) E --> H(Long Term Memory Settings) E --> I(Quota Limit) E --> J(Chat Prompt Task) E --> K(Greeting Prompt Task) E --> L(Moderation Settings) J --> M(Model & Parameters) J --> N(API Keys) J --> O(Prompt Refence) J --> P(Tool Specifications) O --> Q(Template) O --> R(Variables) O --> S(Version) O --> T(...) style K stroke-dasharray: 5, 5 style L stroke-dasharray: 5, 5 style P stroke-dasharray: 5, 5 ``` After setting up an unified persona and knowledge for a character, different backends can be configured. For example, different model may be adopted for different users based on cost considerations. ## How to Play ### Online Website You can visit [freechat.fun](https://www.freechat.fun) to experience FreeChat. Share your designed AI character! ### Running in a Kubernetes Cluster FreeChat is dedicated to the principles of cloud-native design. If you have a Kubernetes cluster, you can deploy FreeChat to your environment by following these steps: 1. Put the Kubernetes configuration file in the `configs/helm/` directory, named `kube-private.conf`. 2. Place the Helm configuration file in the same directory, named `values-private.yaml`. Make sure to reference the default `values.yaml` and customize the variables as needed. 3. Switch to the `scripts/` directory. 4. If needed, run `install-in.sh` to deploy `ingress-nginx` on the Kubernetes cluster. 5. If needed, run `install-cm.sh` to deploy `cert-manager` on the Kubernetes cluster, which automatically issues certificates for domains specified in `ingress.hosts`. 6. Run `install-pvc.sh` to install PersistentVolumeClaim resources. > By default, FreeChat operates files by accessing the \"local file system.\" You may want to use high-availability distributed storage in the cloud. As a cloud-native-designed system, we recommend interfacing through Kubernetes CSI to avoid individually adapting storage products for each cloud platform. Most cloud service providers offer cloud storage drivers for Kubernetes, with a series of predefined StorageClass resources. Please choose the appropriate configuration according to your actual needs and set it in Helm's `global.storageClass` option. > > *In the future, FreeChat may be refactored to use MinIO's APIs directly, as it is now installed in the Kubernetes cluster as a dependency (serving Milvus).* 7. Run `install.sh` script to install FreeChat and its dependencies. 8. FreeChat aims to provide Open API services. If you like the interactive experience of [freechat.fun](https://freechat.fun), run `install-web.sh` to deploy the front-end application. 9. Run `restart.sh` to restart the service. 10. If you modified any Helm configuration files, use `upgrade.sh` to update the corresponding Kubernetes resources. 11. To remove specific resources, run the `uninstall*.sh` script corresponding to the resource you want to uninstall. As a cloud-native application, the services FreeChat relies on are obtained and deployed to your cluster through the helm repository. If you prefer cloud services with SLA (Service Level Agreement) guarantees, simply make the relevant settings in `configs/helm/values-private.yaml`: ```yaml mysql: deployment: enabled: false url: auth: rootPassword: username: password: redis: deployment: enabled: false url: auth: password: milvus: deployment: enabled: false url: milvus: auth: token: ``` With this, FreeChat will not automatically install these services, but rather use the configuration information to connect directly. If your Kubernetes cluster does not have a standalone monitoring system, you can enable the following switch. This will install Prometheus and Grafana services in the same namespace, dedicated to monitoring the status of the services under the FreeChat application: ```yaml prometheus: deployment: enabled: true grafana: deployment: enabled: true ``` ### Running Locally You can also run FreeChat locally. Currently supported on MacOS and Linux (although only tested on MacOS). You need to install the Docker toolset and have a network that can access [Docker Hub](https://hub.docker.com/). Once ready, enter the `scripts/` directory and run `local-run.sh`, which will download and run the necessary docker containers. After a successful startup, you can access `http://localhost` via a browser to see the locally running freechat.fun. The built-in administrator username and password are \"admin:freechat\". Use `local-run.sh --help` to view the supported options of the script. Good luck! ### Running in an IDE To run FreeChat in an IDE, you need to start all dependent services first but do not need to run the container for the FreeChat application itself. You can execute the `scripts/local-deps.sh` script to start services like `MySQL`, `Redis`, `Milvus`, etc., locally. Once done, open and debug `freechat-start/src/main/java/fun/freechat/Application.java`。Make sure you have set the following startup VM options: ```shell -Dspring.config.location=classpath:/application.yml,classpath:/application-local.yml \\ -DAPP_HOME=local-data/freechat \\ -Dspring.profiles.active=local ``` ### Use SDK #### Java - **Dependency** ```xml fun.freechat freechat-sdk ${freechat-sdk.version} ``` - **Example** ```java import fun.freechat.client.ApiClient; import fun.freechat.client.ApiException; import fun.freechat.client.Configuration; import fun.freechat.client.api.AccountApi; import fun.freechat.client.auth.ApiKeyAuth; import fun.freechat.client.model.UserDetailsDTO; public class AccountClientExample { public static void main(String[] args) { ApiClient defaultClient = Configuration.getDefaultApiClient(); defaultClient.setBasePath(\"https://freechat.fun\"); // Configure HTTP bearer authorization: bearerAuth HttpBearerAuth bearerAuth = (HttpBearerAuth) defaultClient.getAuthentication(\"bearerAuth\"); bearerAuth.setBearerToken(\"FREECHAT_TOKEN\"); AccountApi apiInstance = new AccountApi(defaultClient); try { UserDetailsDTO result = apiInstance.getUserDetails(); System.out.println(result); } catch (ApiException e) { e.printStackTrace(); } } } ``` #### Python - **Installation** ```shell pip install freechat-sdk ``` - **Example** ```python import freechat_sdk from freechat_sdk.rest import ApiException from pprint import pprint # Defining the host is optional and defaults to https://freechat.fun # See configuration.py for a list of all supported configuration parameters. configuration = freechat_sdk.Configuration( host = \"https://freechat.fun\" ) # Configure Bearer authorization: bearerAuth configuration = freechat_sdk.Configuration( access_token = os.environ[\"FREECHAT_TOKEN\"] ) # Enter a context with an instance of the API client with freechat_sdk.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = freechat_sdk.AccountApi(api_client) try: details = api_instance.get_user_details() pprint(details) except ApiException as e: print(\"Exception when calling AccountClient->get_user_details: %s\\n\" % e) ``` #### TypeScript - **Installation** ```shell npm install freechat-sdk --save ``` - **Example** Refer to [FreeChatApiContext.tsx](https://github.com/freechat-fun/freechat/blob/main/freechat-web/src/contexts/FreeChatApiProvider.tsx) ## System Dependencies | | Projects | ---- | ---- | Application Framework | [Spring Boot](https://spring.io/projects/spring-boot/) | LLM Framework | [LangChain4j](https://docs.langchain4j.dev/) | Model Providers | [OpenAI](https://platform.openai.com/), [Azure OpenAI](https://oai.azure.com/), [DashScope(Alibaba)](https://dashscope.aliyun.com/) | Database Systems | [MySQL](https://www.mysql.com/), [Redis](https://redis.io/), [Milvus](https://milvus.io/) | Monitoring & Alerting | [Prometheus](https://prometheus.io/), [Grafana](https://grafana.com/) | OpenAPI Tools | [Springdoc-openapi](https://springdoc.org/), [OpenAPI Generator](https://github.com/OpenAPITools/openapi-generator), [OpenAPI Explorer](https://github.com/Authress-Engineering/openapi-explorer) ## Collaboration ### Application Integration The FreeChat system is entirely oriented towards Open APIs. The site [freechat.fun](https://freechat.fun) is developed using its TypeScript SDK and hardly depends on private interfaces. You can use these online interfaces to develop your own applications or sites, making them fit your preferences. Currently, FreeChat is completely free with no paid plans (after all, users use their own API Key to call LLM services). ### Model Integration FreeChat aims to explore AI virtual character technology with anthropomorphic characteristics. So far, it supports model services from OpenAI GPT and Alibaba Qwen series models. However, we are more interested in supporting models that are under research and can endow AI with more personality traits. If you are researching this area and hope FreeChat supports your model, please contact us. We look forward to AI technology helping people create their own \"soul mates\" in the future.
*
* The version of the OpenAPI document: 1.4.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
package fun.freechat.client;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonParseException;
import com.google.gson.TypeAdapter;
import com.google.gson.internal.bind.util.ISO8601Utils;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import com.google.gson.JsonElement;
import io.gsonfire.GsonFireBuilder;
import io.gsonfire.TypeSelector;
import okio.ByteString;
import java.io.IOException;
import java.io.StringReader;
import java.lang.reflect.Type;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.ParsePosition;
import java.time.LocalDate;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
import java.util.HashMap;
/*
* A JSON utility class
*
* NOTE: in the future, this class may be converted to static, which may break
* backward-compatibility
*/
public class JSON {
private static Gson gson;
private static boolean isLenientOnJson = false;
private static DateTypeAdapter dateTypeAdapter = new DateTypeAdapter();
private static SqlDateTypeAdapter sqlDateTypeAdapter = new SqlDateTypeAdapter();
private static OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new OffsetDateTimeTypeAdapter();
private static LocalDateTypeAdapter localDateTypeAdapter = new LocalDateTypeAdapter();
private static ByteArrayAdapter byteArrayAdapter = new ByteArrayAdapter();
@SuppressWarnings("unchecked")
public static GsonBuilder createGson() {
GsonFireBuilder fireBuilder = new GsonFireBuilder()
;
GsonBuilder builder = fireBuilder.createGsonBuilder();
return builder;
}
private static String getDiscriminatorValue(JsonElement readElement, String discriminatorField) {
JsonElement element = readElement.getAsJsonObject().get(discriminatorField);
if (null == element) {
throw new IllegalArgumentException("missing discriminator field: <" + discriminatorField + ">");
}
return element.getAsString();
}
/**
* Returns the Java class that implements the OpenAPI schema for the specified discriminator value.
*
* @param classByDiscriminatorValue The map of discriminator values to Java classes.
* @param discriminatorValue The value of the OpenAPI discriminator in the input data.
* @return The Java class that implements the OpenAPI schema
*/
private static Class getClassByDiscriminator(Map classByDiscriminatorValue, String discriminatorValue) {
Class clazz = (Class) classByDiscriminatorValue.get(discriminatorValue);
if (null == clazz) {
throw new IllegalArgumentException("cannot determine model class of name: <" + discriminatorValue + ">");
}
return clazz;
}
static {
GsonBuilder gsonBuilder = createGson();
gsonBuilder.registerTypeAdapter(Date.class, dateTypeAdapter);
gsonBuilder.registerTypeAdapter(java.sql.Date.class, sqlDateTypeAdapter);
gsonBuilder.registerTypeAdapter(OffsetDateTime.class, offsetDateTimeTypeAdapter);
gsonBuilder.registerTypeAdapter(LocalDate.class, localDateTypeAdapter);
gsonBuilder.registerTypeAdapter(byte[].class, byteArrayAdapter);
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.AgentCreateDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.AgentDetailsDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.AgentItemForNameDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.AgentQueryDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.AgentQueryWhere.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.AgentSummaryDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.AgentSummaryStatsDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.AgentUpdateDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.AiApiKeyCreateDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.AiApiKeyInfoDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.AiModelInfoDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.ApiTokenInfoDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.AppConfigInfoDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.AppMetaDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.CharacterBackendDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.CharacterBackendDetailsDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.CharacterCreateDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.CharacterDetailsDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.CharacterItemForNameDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.CharacterQueryDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.CharacterQueryWhere.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.CharacterSummaryDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.CharacterSummaryStatsDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.CharacterUpdateDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.ChatContentDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.ChatContextDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.ChatCreateDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.ChatMessageDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.ChatMessageRecordDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.ChatPromptContentDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.ChatSessionDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.ChatToolCallDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.ChatUpdateDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.HotTagDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.InteractiveStatsDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.LlmResultDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.MemoryUsageDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.OpenAiParamDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.PluginCreateDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.PluginDetailsDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.PluginQueryDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.PluginQueryWhere.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.PluginSummaryDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.PluginSummaryStatsDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.PluginUpdateDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.PromptAiParamDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.PromptCreateDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.PromptDetailsDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.PromptItemForNameDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.PromptQueryDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.PromptQueryWhere.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.PromptRefDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.PromptSummaryDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.PromptSummaryStatsDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.PromptTaskDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.PromptTaskDetailsDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.PromptTemplateDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.PromptUpdateDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.QwenParamDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.RagTaskDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.RagTaskDetailsDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.SseEmitter.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.TokenUsageDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.UserBasicInfoDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.UserDetailsDTO.CustomTypeAdapterFactory());
gsonBuilder.registerTypeAdapterFactory(new fun.freechat.client.model.UserFullDetailsDTO.CustomTypeAdapterFactory());
gson = gsonBuilder.create();
}
/**
* Get Gson.
*
* @return Gson
*/
public static Gson getGson() {
return gson;
}
/**
* Set Gson.
*
* @param gson Gson
*/
public static void setGson(Gson gson) {
JSON.gson = gson;
}
public static void setLenientOnJson(boolean lenientOnJson) {
isLenientOnJson = lenientOnJson;
}
/**
* Serialize the given Java object into JSON string.
*
* @param obj Object
* @return String representation of the JSON
*/
public static String serialize(Object obj) {
return gson.toJson(obj);
}
/**
* Deserialize the given JSON string to Java object.
*
* @param Type
* @param body The JSON string
* @param returnType The type to deserialize into
* @return The deserialized Java object
*/
@SuppressWarnings("unchecked")
public static T deserialize(String body, Type returnType) {
try {
if (isLenientOnJson) {
JsonReader jsonReader = new JsonReader(new StringReader(body));
// see https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/stream/JsonReader.html#setLenient(boolean)
jsonReader.setLenient(true);
return gson.fromJson(jsonReader, returnType);
} else {
return gson.fromJson(body, returnType);
}
} catch (JsonParseException e) {
// Fallback processing when failed to parse JSON form response body:
// return the response body string directly for the String return type;
if (returnType.equals(String.class)) {
return (T) body;
} else {
throw (e);
}
}
}
/**
* Gson TypeAdapter for Byte Array type
*/
public static class ByteArrayAdapter extends TypeAdapter {
@Override
public void write(JsonWriter out, byte[] value) throws IOException {
if (value == null) {
out.nullValue();
} else {
out.value(ByteString.of(value).base64());
}
}
@Override
public byte[] read(JsonReader in) throws IOException {
switch (in.peek()) {
case NULL:
in.nextNull();
return null;
default:
String bytesAsBase64 = in.nextString();
ByteString byteString = ByteString.decodeBase64(bytesAsBase64);
return byteString.toByteArray();
}
}
}
/**
* Gson TypeAdapter for JSR310 OffsetDateTime type
*/
public static class OffsetDateTimeTypeAdapter extends TypeAdapter {
private DateTimeFormatter formatter;
public OffsetDateTimeTypeAdapter() {
this(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
}
public OffsetDateTimeTypeAdapter(DateTimeFormatter formatter) {
this.formatter = formatter;
}
public void setFormat(DateTimeFormatter dateFormat) {
this.formatter = dateFormat;
}
@Override
public void write(JsonWriter out, OffsetDateTime date) throws IOException {
if (date == null) {
out.nullValue();
} else {
out.value(formatter.format(date));
}
}
@Override
public OffsetDateTime read(JsonReader in) throws IOException {
switch (in.peek()) {
case NULL:
in.nextNull();
return null;
default:
String date = in.nextString();
if (date.endsWith("+0000")) {
date = date.substring(0, date.length()-5) + "Z";
}
return OffsetDateTime.parse(date, formatter);
}
}
}
/**
* Gson TypeAdapter for JSR310 LocalDate type
*/
public static class LocalDateTypeAdapter extends TypeAdapter {
private DateTimeFormatter formatter;
public LocalDateTypeAdapter() {
this(DateTimeFormatter.ISO_LOCAL_DATE);
}
public LocalDateTypeAdapter(DateTimeFormatter formatter) {
this.formatter = formatter;
}
public void setFormat(DateTimeFormatter dateFormat) {
this.formatter = dateFormat;
}
@Override
public void write(JsonWriter out, LocalDate date) throws IOException {
if (date == null) {
out.nullValue();
} else {
out.value(formatter.format(date));
}
}
@Override
public LocalDate read(JsonReader in) throws IOException {
switch (in.peek()) {
case NULL:
in.nextNull();
return null;
default:
String date = in.nextString();
return LocalDate.parse(date, formatter);
}
}
}
public static void setOffsetDateTimeFormat(DateTimeFormatter dateFormat) {
offsetDateTimeTypeAdapter.setFormat(dateFormat);
}
public static void setLocalDateFormat(DateTimeFormatter dateFormat) {
localDateTypeAdapter.setFormat(dateFormat);
}
/**
* Gson TypeAdapter for java.sql.Date type
* If the dateFormat is null, a simple "yyyy-MM-dd" format will be used
* (more efficient than SimpleDateFormat).
*/
public static class SqlDateTypeAdapter extends TypeAdapter {
private DateFormat dateFormat;
public SqlDateTypeAdapter() {}
public SqlDateTypeAdapter(DateFormat dateFormat) {
this.dateFormat = dateFormat;
}
public void setFormat(DateFormat dateFormat) {
this.dateFormat = dateFormat;
}
@Override
public void write(JsonWriter out, java.sql.Date date) throws IOException {
if (date == null) {
out.nullValue();
} else {
String value;
if (dateFormat != null) {
value = dateFormat.format(date);
} else {
value = date.toString();
}
out.value(value);
}
}
@Override
public java.sql.Date read(JsonReader in) throws IOException {
switch (in.peek()) {
case NULL:
in.nextNull();
return null;
default:
String date = in.nextString();
try {
if (dateFormat != null) {
return new java.sql.Date(dateFormat.parse(date).getTime());
}
return new java.sql.Date(ISO8601Utils.parse(date, new ParsePosition(0)).getTime());
} catch (ParseException e) {
throw new JsonParseException(e);
}
}
}
}
/**
* Gson TypeAdapter for java.util.Date type
* If the dateFormat is null, ISO8601Utils will be used.
*/
public static class DateTypeAdapter extends TypeAdapter {
private DateFormat dateFormat;
public DateTypeAdapter() {}
public DateTypeAdapter(DateFormat dateFormat) {
this.dateFormat = dateFormat;
}
public void setFormat(DateFormat dateFormat) {
this.dateFormat = dateFormat;
}
@Override
public void write(JsonWriter out, Date date) throws IOException {
if (date == null) {
out.nullValue();
} else {
String value;
if (dateFormat != null) {
value = dateFormat.format(date);
} else {
value = ISO8601Utils.format(date, true);
}
out.value(value);
}
}
@Override
public Date read(JsonReader in) throws IOException {
try {
switch (in.peek()) {
case NULL:
in.nextNull();
return null;
default:
String date = in.nextString();
try {
if (dateFormat != null) {
return dateFormat.parse(date);
}
return ISO8601Utils.parse(date, new ParsePosition(0));
} catch (ParseException e) {
throw new JsonParseException(e);
}
}
} catch (IllegalArgumentException e) {
throw new JsonParseException(e);
}
}
}
public static void setDateFormat(DateFormat dateFormat) {
dateTypeAdapter.setFormat(dateFormat);
}
public static void setSqlDateFormat(DateFormat dateFormat) {
sqlDateTypeAdapter.setFormat(dateFormat);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy