[feat][elixir] use elixir 1.18 built-in json module (#21039)

* feat: replace jason by built-in json encoder/decoder

* chore: update samples
This commit is contained in:
Enrique Fernández 2025-04-08 12:47:37 +02:00 committed by GitHub
parent 7a3ea2872a
commit dcd9463e88
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
60 changed files with 71 additions and 77 deletions

View File

@ -57,11 +57,10 @@ public class ElixirClientCodegen extends DefaultCodegen {
// This is the name of elixir project name;
protected static final String defaultPackageName = "openapi_client";
String supportedElixirVersion = "1.10";
String supportedElixirVersion = "1.18";
List<String> extraApplications = Arrays.asList(":logger");
List<String> deps = Arrays.asList(
"{:tesla, \"~> 1.7\"}",
"{:jason, \"~> 1.4\"}",
"{:ex_doc, \"~> 0.30\", only: :dev, runtime: false}",
"{:dialyxir, \"~> 1.3\", only: [:dev, :test], runtime: false}");
@ -694,7 +693,7 @@ public class ElixirClientCodegen extends DefaultCodegen {
}
public String decodedStruct() {
// Let Jason decode the entire response into a generic blob
// Decode the entire response into a generic blob
if (isMap) {
return "%{}";
}

View File

@ -216,7 +216,7 @@ defmodule {{moduleName}}.Connection do
tesla_options = Application.get_env(:tesla, __MODULE__, [])
middleware = Keyword.get(tesla_options, :middleware, [])
json_engine = Keyword.get(tesla_options, :json, Jason)
json_engine = Keyword.get(tesla_options, :json, JSON)
user_agent =
Keyword.get(

View File

@ -4,15 +4,13 @@ defmodule {{moduleName}}.Deserializer do
Helper functions for deserializing responses into models
"""
@jason_decode_opts [keys: :strings]
def jason_decode(json) do
Jason.decode(json, @jason_decode_opts)
def json_decode(json) do
JSON.decode(json)
end
def jason_decode(json, module) do
def json_decode(json, module) do
json
|> jason_decode()
|> json_decode()
|> case do
{:ok, decoded} -> {:ok, to_struct(decoded, module)}
{:error, _} = error -> error

View File

@ -4,7 +4,7 @@
{{&description}}
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
{{#vars}}{{#atom}}{{&baseName}}{{/atom}}{{^-last}},
{{/-last}}{{/vars}}

View File

@ -94,7 +94,7 @@ defmodule {{moduleName}}.RequestBuilder do
Tesla.Multipart.add_field(
multipart,
key,
Jason.encode!(value),
JSON.encode!(value),
headers: [{:"Content-Type", "application/json"}]
)
end)
@ -187,10 +187,10 @@ defmodule {{moduleName}}.RequestBuilder do
defp decode(%Tesla.Env{} = env, false), do: {:ok, env}
defp decode(%Tesla.Env{body: body}, %{}) do
{{moduleName}}.Deserializer.jason_decode(body)
{{moduleName}}.Deserializer.json_decode(body)
end
defp decode(%Tesla.Env{body: body}, module) do
{{moduleName}}.Deserializer.jason_decode(body, module)
{{moduleName}}.Deserializer.json_decode(body, module)
end
end

View File

@ -153,7 +153,7 @@ defmodule OpenapiPetstore.Connection do
tesla_options = Application.get_env(:tesla, __MODULE__, [])
middleware = Keyword.get(tesla_options, :middleware, [])
json_engine = Keyword.get(tesla_options, :json, Jason)
json_engine = Keyword.get(tesla_options, :json, JSON)
user_agent =
Keyword.get(

View File

@ -6,15 +6,13 @@ defmodule OpenapiPetstore.Deserializer do
Helper functions for deserializing responses into models
"""
@jason_decode_opts [keys: :strings]
def jason_decode(json) do
Jason.decode(json, @jason_decode_opts)
def json_decode(json) do
JSON.decode(json)
end
def jason_decode(json, module) do
def json_decode(json, module) do
json
|> jason_decode()
|> json_decode()
|> case do
{:ok, decoded} -> {:ok, to_struct(decoded, module)}
{:error, _} = error -> error

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.FooGetDefaultResponse do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:string
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.SpecialModelName do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:"$special[property.name]"
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.AdditionalPropertiesClass do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:map_property,
:map_of_map_property

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.AllOfWithSingleRef do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:username,
:SingleRefType

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.Animal do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:className,
:color

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.Any do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:"@type"
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.ApiResponse do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:code,
:type,

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.ArrayOfArrayOfNumberOnly do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:ArrayArrayNumber
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.ArrayOfNumberOnly do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:ArrayNumber
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.ArrayTest do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:array_of_string,
:array_array_of_integer,

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.Capitalization do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:smallCamel,
:CapitalCamel,

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.Cat do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:className,
:color,

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.Category do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:id,
:name

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.ChildWithNullable do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:type,
:nullableProperty,

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.ClassModel do
Model for testing model with \"_class\" property
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:_class
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.Client do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:client
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.DeprecatedModel do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:name
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.Dog do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:className,
:color,

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.EnumArrays do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:just_symbol,
:array_enum

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.EnumClass do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.EnumTest do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:enum_string,
:enum_string_required,

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.FakeBigDecimalMap200Response do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:someId,
:someMap

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.File do
Must be named `File` for test.
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:sourceURI
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.FileSchemaTestClass do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:file,
:files

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.Foo do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:bar
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.FormatTest do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:integer,
:int32,

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.HasOnlyReadOnly do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:bar,
:foo

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.HealthCheckResult do
Just a string to inform instance is up and running. Make it nullable in hope to get it as pointer in generated model.
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:NullableMessage
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.List do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:"123-list"
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.MapTest do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:map_map_of_string,
:map_of_enum_string,

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.MixedPropertiesAndAdditionalPropertiesClass do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:uuid,
:dateTime,

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.Model200Response do
Model for testing model name starting with number
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:name,
:class

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.Name do
Model for testing model name same as property name
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:name,
:snake_case,

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.NullableClass do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:integer_prop,
:number_prop,

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.NumberOnly do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:JustNumber
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.ObjectWithDeprecatedFields do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:uuid,
:id,

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.Order do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:id,
:petId,

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.OuterComposite do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:my_number,
:my_string,

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.OuterEnum do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.OuterEnumDefaultValue do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.OuterEnumInteger do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.OuterEnumIntegerDefaultValue do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.OuterObjectWithEnumProperty do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:value
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.ParentWithNullable do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:type,
:nullableProperty

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.Pet do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:id,
:category,

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.ReadOnlyFirst do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:bar,
:baz

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.Return do
Model for testing reserved words
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:return
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.SingleRefType do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.Tag do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:id,
:name

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.TestInlineFreeformAdditionalPropertiesRequest do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:someProperty
]

View File

@ -6,7 +6,7 @@ defmodule OpenapiPetstore.Model.User do
"""
@derive Jason.Encoder
@derive JSON.Encoder
defstruct [
:id,
:username,

View File

@ -96,7 +96,7 @@ defmodule OpenapiPetstore.RequestBuilder do
Tesla.Multipart.add_field(
multipart,
key,
Jason.encode!(value),
JSON.encode!(value),
headers: [{:"Content-Type", "application/json"}]
)
end)
@ -189,10 +189,10 @@ defmodule OpenapiPetstore.RequestBuilder do
defp decode(%Tesla.Env{} = env, false), do: {:ok, env}
defp decode(%Tesla.Env{body: body}, %{}) do
OpenapiPetstore.Deserializer.jason_decode(body)
OpenapiPetstore.Deserializer.json_decode(body)
end
defp decode(%Tesla.Env{body: body}, module) do
OpenapiPetstore.Deserializer.jason_decode(body, module)
OpenapiPetstore.Deserializer.json_decode(body, module)
end
end

View File

@ -5,7 +5,7 @@ defmodule OpenapiPetstore.Mixfile do
[
app: :openapi_petstore,
version: "1.0.0",
elixir: "~> 1.10",
elixir: "~> 1.18",
build_embedded: Mix.env() == :prod,
start_permanent: Mix.env() == :prod,
package: package(),
@ -36,7 +36,6 @@ defmodule OpenapiPetstore.Mixfile do
defp deps do
[
{:tesla, "~> 1.7"},
{:jason, "~> 1.4"},
{:ex_doc, "~> 0.30", only: :dev, runtime: false},
{:dialyxir, "~> 1.3", only: [:dev, :test], runtime: false}
]