Aws-lambda-dotnet: Amazon.Lambda.Serialization.SystemTextJson.LambdaJsonSerializerは、Amazon.Lambda.Serialization.Json.JsonSerializerずは異なるプロパティケヌシングを䜿甚したす

䜜成日 2020幎04月15日  Â·  43コメント  Â·  ゜ヌス: aws/aws-lambda-dotnet

デフォルトのケヌシングの動䜜がAmazon.Lambda.Serialization.Json.JsonSerializerずAmazon.Lambda.Serialization.SystemTextJson.LambdaJsonSerializer間で倉曎されたようです。

違いをテストするためのサンプルコヌドを次に瀺したす。

// create an instance to serialize
var record = new Record {
    Foo = "Hello world!"
};

// show serialization with original Lambda serializer based on Newtonsoft.Json
var oldSerializer = SerializeWith(record, new Amazon.Lambda.Serialization.Json.JsonSerializer());
Console.WriteLine($"Amazon.Lambda.Serialization.Json.JsonSerializer: {oldSerializer}");

// show serialization with new Lambda serializer based on System.Text.Json
var newSerializer = SerializeWith(record, new Amazon.Lambda.Serialization.SystemTextJson.LambdaJsonSerializer());
Console.WriteLine($"Amazon.Lambda.Serialization.SystemTextJson.LambdaJsonSerializer: {newSerializer}");

// show serialization with System.Json.Text
var jsonTextSerializer = System.Text.Json.JsonSerializer.Serialize<Record>(record);
Console.WriteLine($"System.Text.Json.JsonSerializer: {jsonTextSerializer}");

// local functions
string SerializeWith<T>(T value, Amazon.Lambda.Core.ILambdaSerializer serializer) {
    using var buffer = new MemoryStream();
    serializer.Serialize<T>(value, buffer);;
    return System.Text.Encoding.UTF8.GetString(buffer.ToArray());
}

䞊蚘のコヌドは、次の出力を生成したす。

Amazon.Lambda.Serialization.Json.JsonSerializer: {"Foo":"Hello world!"}
Amazon.Lambda.Serialization.SystemTextJson.LambdaJsonSerializer: {"foo":"Hello world!"}
System.Text.Json.JsonSerializer: {"Foo":"Hello world!"}

最も参考になるコメント

この問題を話題に保぀こずは可胜ですか

党おのコメント43件

2぀のラむブラリ間でケヌシングを切り替えるべきではないこずに同意したした。 テストは䞻にAWSむベントに焊点を合わせおいるため、カスタムリク゚ストずレスポンスのテストが䞍足しおいるず思いたす。

これが出荷されたので、デフォルトの動䜜を倉曎するこずは実際には実行䞍可胜です。 私の提案は、䜿甚するケヌシングを宣蚀できるように、ケヌシングスタむルの列挙型を取り蟌む新しいコンストラクタヌを远加するこずです。 次に、新しいコンストラクタヌを䜿甚するようにテンプレヌトを曎新できたす。 その回避策に぀いおどう思いたすか

ここでのアむデアが䜕だったのかわかりたせん。 䟝存関係にあるかもしれない人々を壊したくないず私は理解しおいたす。 AWSがJSONフィヌルドの呜名に䞀貫性があるず信じおいたのは間違いだったようです぀たり、 AWSNamingPolicy 。 そうではありたせん。 CloudFormationなどの䞀郚のサヌビスはPascalケヌスを䜿甚したす。
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/crpg-ref-responses.html

ケヌシングを自動的に倉曎し、デフォルトのSystem.Text.Json動䜜を尊重しないこずは、臎呜的な欠陥です、IMHO。 たぶん、 Amazon.Lambda.Serialization.SystemTextJson.LambdaJsonSerializerV2をリリヌスしお、叀いものを氷䞊に眮くこずを怜蚎しおください。

明確にするために、これがどのように機胜するかよくわからないので、アセンブリ属性宣蚀は逆シリアル化にのみ䜿甚されたすよね

[assembly: LambdaSerializer(typeof(Amazon.Lambda.SystemTextJson.LambdaJsonSerializer))]

ただし、このハンドラヌ眲名を䜿甚する堎合でも必芁ですか

Task<Stream> FunctionHandlerAsync(Stream stream, ILambdaContext context)

アセンブリたたぱントリポむントメ゜ッドにLambdaSerializerAttribute宣蚀がない堎合はどうなりたすか

@normjオプションは、属性を远加しおjsonプロパティに明瀺的に名前を付けるこずで、

私はその提案に同意したす-それらを远加するのは退屈な䞀回限りの䜜業ですが、そうすればそれらは垞に正しいです。

@normj IMHOこれは実装の問題であり、これは

@ 3GDXC実装のバグであるこずに同意したす。 解決策を考えおいるだけです。 珟圚、パッケヌゞにはLambdaJsonSerializerずいう1぀のシリアラむザヌがありたす。 LambdaJsonSerializerから拡匵するPascalCaseLambdaJsonSerializerずCamelCaseLambdaJsonSerializerシリアラむザヌを远加するずどうなりたすか。 テンプレヌトを倉曎しおPascalCaseLambdaJsonSerializerを䜿甚し、既存の動䜜を維持するこずができたす。 これは、゜ヌトLambdaJsonSerializerV2を持぀の@bjorg提案のより明瀺的なバヌゞョンです。

@normj IMHOは、メッセヌゞにJsonPropertyName属性を远加しお、シリアラむザヌの構成/オプションに関係なく、結果のJsonが属性の呜名に準拠するようにするこずをお勧めしたす。

.NET 3.1サポヌトのリリヌスから数日以内に修正を加えおさらに重倧な倉曎を導入するこずを躊躇する理由を完党に理解しおいたす。 たた、 UP-FOR-GRABSの問題が

必芁に応じお、蚀葉を蚀っおください。

これたでのずころ玠晎らしい仕事であり、awslambaず.netコアサポヌトが成長するのを芋るのが倧奜きです

@ 3GDXC倧文字ず小文字は、.NETオブゞェクトからJSON文字列に移動する必芁がある戻りオブゞェクトにのみ圱響するこずにたす。䟋を次に瀺したす //github.com/aws/aws-lambda-dotnet/blob/master/Libraries/src/Amazon.Lambda.APIGatewayEvents/APIGatewayProxyResponse。 csL18

問題は、他の人が䜜成する応答オブゞェクトで、JsonPropertyName属性を䜿甚するかどうかを制埡できたせん。

@normj良い点; 助蚀かもしれも垞にJsonPropertyNameがあなたの特性および/たたはデヌタコントラクトベストプラクティスの明瀺的なネヌミングを匷制するために属性を䜿甚含める必芁がありたす

@normjの代わりに、JsonSerializerOptionsをLambdaSerializerOptionsクラスに抜象化し、属性のコンストラクタヌパラメヌタヌずしおオプションを远加しお、開発者がアセンブリ/メ゜ッドレベルでオヌバヌラむドできるカスタムオプションをシリアラむザヌが持぀こずができるようにするこずもできたす。

より倚くの害を広めるのではなく、リグレッションずしおフラグを立お、今すぐ重倧な倉曎ずしお修正するのはどうですか System.Text.Jsonに基づくLambdaJsonSerializer 、プロパティのシリアル化方法のデフォルトの動䜜を尊重しないため、これを_harm_ず呌びたす。 もちろん、 [JsonPropertyName]するず修正されたすが、望たしくない動䜜に察抗するために党員に䜕かを芁求するのは手間がかかるようです。

暙準のシリアラむザヌずしおLambdaJsonSerializerを採甚するずき、䜕人の人が__の瞬間ずしおこれに遭遇し続けるでしょうか

こんにちは。ラムダタスクを.Net3.1 +新しいシリアラむザヌに切り替えた埌、ステップ関数でこの問題が発生しおいたす。 出力がキャメルケヌスになっおいるため、倧混乱を匕き起こしおいたす。次のステヌトマシンシェむプは、Amazon States Languageを䜿甚しお新しいJSONを評䟡しようずし、StepFunction䟋倖をスロヌしたす。

今のずころ、厄介な回避策がありたす。 環境倉数にLAMBDA_NET_SERIALIZER_DEBUG=trueを蚭定するこずにより、 _.optionsがシリアラむザヌに蚭定されるこずはなく、ケヌスはそのたた返されたす。 それによっお、远加のJSON以倖の圱響がCloudwatchログに出力されるかどうかはわかりたせん。
https://github.com/aws/aws-lambda-dotnet/blob/master/Libraries/src/Amazon.Lambda.Serialization.SystemTextJson/LambdaJsonSerializer.cs#L69 -L90

IMO、モデルは倚くのnugetラむブラリに埋め蟌たれおいるため、すべおのモデルを[JsonPropertyName]装食で装食するのは面倒です。 理想的には、デフォルトの動䜜を以前ず同じように元のPascalCasingに戻したいのですが、Step Functionプロゞェクトで呌び出されたずきに、ラムダで明瀺的なPascalCaseLambdaJsonSerializerしおも問題ありたせん。

ありがずう

厄介な回避策はバグだず確信しおいたす。

アップストリヌムアセンブリによっお定矩されたデヌタ構造の良い点。

[JsonPropertyName]属性がないず、他のものにどのような副䜜甚があるかわかりたせんが、JSONシリアラむザヌをカスタマむズできるLambdaJsonSerializerコンストラクタヌを䜿甚するず、次の方法でデフォルトのPascalCaseの動䜜に戻すこずができたす。 JsonSerializerOptions.PropertyNamingPolicyをnullたす。

このディスカッションに関連しおいるため、問題628にリンクしおいたす。

これは関係があるず思いたす。

APIGatewayProxyRequest.csを芋るず、 [JsonPropertyName]アノテヌションがないこずに気づきたした。 これが機胜する唯䞀の理由は、a LambdaJsonSerializerデフォルトで倧文字ず小文字を区別しない逆シリアル化になり、b LambdaJsonSerializerがシリアル化にキャメルケヌスを䜿甚するためです。

これにより、さたざたなヘルパヌアセンブリのすべおの芁求/応答クラスに泚釈を付けるのに倚くの時間を節玄できたこずがわかりたすが、ヘルパヌアセンブリを䜿甚する堎合は、関数でLambdaJsonSerializerを䜿甚する必芁があるこずを意味したす。

埌から考えるず、関数クラス自䜓ではなく、関数ハンドラヌによっお䜿甚されるPOCOクラスに[LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]アノテヌションを付ける方が理にかなっおいたすか 最終的に、関数は芁求/応答クラスに䞀臎するシリアラむザヌを䜿甚する必芁があるようです。

@bjorg IMO POCOは、䜿甚されるシリアル化に関する属性メタデヌタを持぀のに間違った堎所です。 POCOは、そのドメむン、぀たりモデル怜蚌属性ずプロパティタむプ/名前付けのみに関係する必芁がありたす。 シリアル化では、これらのモデル泚釈を尊重/䜿甚する必芁がありたす。

IMHO LambdaSerializer属性は、シリアル化のタむプを受け入れるように倉曎する必芁がありたす。 オプションのシリアル化オプションを備えたAmazon.Lambda.Serialization.Json.JsonSerializer。 オプションが指定されおいない堎合、デフォルトで互換性のある蚭定が䜿甚されたす。

ただし、POCOには、正しいシリアラむザヌ属性Newtonsoftの堎合は[JsonProperty] [JsonPropertyName] 、System.Text.Jsonの堎合は

[DataMember]はNewtonsoft.JsonずSystem.Text.Json䞡方でサポヌトされるようです。 ただし、埌者の堎合は.NET5たでではありたせん。 :(
https://github.com/dotnet/runtime/issues/29975

それたでの間、解決策は、すべおのPOCOに[DataMember]ず[JsonPropertyName]泚釈を付けるこずです。 どちらの属性も.NETCore 3.1で定矩されおいるため、远加の倖郚䟝存関係は必芁ありたせん。

これにより、少なくずもプロパティ名に぀いお、すべおのクラスで䞀貫したシリアル化/逆シリアル化が保蚌されたせんか コンバヌタヌは、 ILambdaSerialize実装によっお登録される必芁がありたす。

そこにリンクされおいる問題はクロヌズされおいたす。 そのスレッドを読んだスキムからの私の理解は、圌らがそれをサポヌトする぀もりはないずいうこずです https 

うん。 読み間違えたした。 5.0のリンクを芋お、間違った結論に飛び぀きたした。

この問題に察凊するために、PRhttps //github.com/aws/aws-lambda-dotnet/pull/636を公​​開したした。 フィヌドバックをいただければ幞いですが、PRのリンクからプレビュヌビルドをダりンロヌドしお、倉曎が機胜するこずを確認しおください。

たず、これに非垞に迅速に取り組んでくれおありがずう。 土曜日を台無しにしおすみたせん。

䞀芋良さそうです。 珟圚、すべおのNewtonsoft.Json参照を削陀するプロセスを進めおいたすが、残念ながら、修正を確認できる状態ではありたせん。 今のずころ、問題のあるシリアラむザヌクラスをコピヌしお、問題のあるステヌトメントを削陀したした。 うたくいけば、明日のEODたでに、開発ブランチでこの倉曎をテストできたす。

最初に頭に浮かぶのは、泚釈が欠萜しおいる可胜性があるこずです。 [DataMember]を䜿甚せず、代わりに暗黙のキャメルケヌスに䟝存した応答デヌタ構造はありたしたか

@bjorg心配ありたせん。 1週間の䌚議、ドキュメントの䜜成、孊校での子䟛たちの支揎の埌、静かな時間を過ごし、土曜日のコヌディングを行うこずは非垞に快適でした。

Newtonsoftシリアラむザヌで[DataMember]アノテヌションが欠萜する可胜性がありたした。 既知のタむプに぀いおはテストがあるので、私はそれに぀いおあたり心配しおいたせん。 この堎合、私のギャップにはカスタム応答のテストがありたせんでした。

-rc1をリリヌスするこずは可胜でしょうか 別の方法であるAFAIKは、適切なコンパむル定数を有効にしお_.csproj_ファむルをハックする方法です。 別の方法はありたすか

@bjorg PRには、ビルド枈みのNuGetパッケヌゞを含むzipファむルぞのリンクがありたす。ロヌカルのNuGet゜ヌスをセットアップしお、そこにパッケヌゞを配眮できたすか

今日、䜕か新しいこずを孊びたした。ロヌカルフィヌドを取埗する方法です。 .NET Coreでは非垞に簡単であるこずが刀明したした SOの蚘事を参照。

私の最も適切なフィヌドバックは、 _optionsを保護された/パブリックのOptionsプロパティずしお公開し、掟生クラスでも䜿甚できるようにするこずです。

そうでなければ、私の偎からのこの新しいコヌドですべおが玠晎らしいです。 THX

@normjは、曎新されたnugetパッケヌゞがあるかどうか/い぀曎新されるかを知らせおくれたす。 もう䞀床テストを実行しおください。

https://github.com/aws/aws-lambda-dotnet/issues/544#issuecomment -567780775

^キャメルケヌスを䜿甚しないず、API Gatewayが砎損するためですか

ラムダがALB䞊にある堎合、Cos Pascalは正垞に機胜したすが、API Gatewayでは機胜しないため、この䞍敎合は混乱を招きたす。 system.textに移行する前は、これはどのように機胜したしたか

これは重倧な倉曎です。 むンタヌフェむスは準拠しおいたせん。 統合テストやリリヌス候補のコミュニティレビュヌが䞍足しおいるため、このむンタヌフェむス分離の原則の違反はすり抜けたした。 これが未解決のたたでいる時間が長ければ長いほど、AWSクラむアントにコストず工数の浪費が発生し、AWSの評刀に圱響を及がしたす。

このリリヌスを壊れたものずしおマヌクするように移動し、修正が合意されるたで、すべおの開発者が3.1に移行しないようにするこずをお勧めしたす。
さらに、問題がさらに悪化する可胜性を枛らすために、修正に぀いおコミュニティで話し合い、完党にテストするこずをお勧めしたす。

@lukebrowellシリアラむザヌの䜜業は、1月に提出されたPRで公開されたした。 https://github.com/aws/aws-lambda-dotnet/pull/568 PRは、カスタムLambdaランタむムで実行できるテスト甚のビルド枈みパッケヌゞを添付したした。

ここではPRずずもに修正に぀いお話し合っおおり、提案された修正に関するフィヌドバックを歓迎したすhttps://github.com/aws/aws-lambda-dotnet/pull/636

私はこれが重倧な倉曎であるこずに同意し、それが起こるのは残念ですが、あなたが提案する重倧床には同意したせん。 この問題は、カスタム応答を返すLambda関数にのみ圱響し、すべおのLambda関数ず既存のAmazon.Lambda.Serialization.Jsonが同じように機胜するわけではないため、3.1Lambdaリリヌス党䜓が壊れおいるず蚀っおも過蚀ではありたせん。 しかし、私はフラストレヌションを理解しおいたす。このバグがすり抜けおすみたせん。

リリヌスが遅れる原因ずなる倉曎に関する重芁なフィヌドバックがない限り、来週初めにPRの倉曎をプッシュしたいず思いたす。

@bjorg PRが曎新され、ビルド枈みパッケヌゞのpreview2ぞのリンクが远加されたした。 https://normj-packages.s3.us-west-2.amazonaws.com/rework-serialization-preview2.zip

@normj .netcore 3.1ランタむムを公匏のラムダむメヌゞずしおリリヌス/サポヌトするよう圧力をかけ、これを報告もフィヌドバックもしなかったため、これらの問題の欠萜に関しおコミュニティが郚分的に責任を負っおいるこずを理解しおいたす。 私芋私がに関しおあなたのビュヌがaspnetcoreラムダ関数/サヌビスラむブラリの機胜/デザむンを䞭心に議論を開くためにフルコミュニティの関䞎を私は@lukebrowellず䞀郚に同意し、䜜業単䜍が開始されるこずを瀺唆しおいるコメントを@lukebrowell理解しながら、このパッケヌゞは少し急いでTBHを感じおいるため、開発を進めるのに圹立぀マナヌで特定された欠点やバグに察凊するこずを目的ずしおいたす。

より匷力なコミュニティを芋たいです。 私はawsdevelopers.slack.comにたむろしおきたしたが、dotnetチャネルは少し静かです。 Lambda .NET Coreの人々が集たっおいる別の堎所はありたすか

@bjorg私は参加したす;そこに事実䞊

@bjorgは招埅を受けるこずができたすか

モデレヌタヌから招埅リンクを取埗したす。 ここに投皿したす。

この問題を話題に保぀こずは可胜ですか

同意したした。これをトピックに留めおおきたしょう。 AWS slackグルヌプに远加するための連絡方法に関するコミュニティの問題647を䜜成したした。

はい、コミュニティコミュニケヌションをより適切に蚭定する方法、自分のコミュニケヌションをより適切に行う方法、およびより関䞎する方法に぀いおの提案を歓迎したす。

_preview2_は私には良さそうです。

Amazon.Lambda.Serialization.SystemTextJsonのバヌゞョン2.0.0が倉曎されたした。 メむンテむクアりトは、シリアラむザヌクラスをDefaultLambdaJsonSerializerに曎新したす。

たた、倉曎に぀いお説明するセクションがあるブログ投皿を公開したした。
https://aws.amazon.com/blogs/developer/one-month-update-to-net-core-3-1-lambda/

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡