2020年10月12日月曜日

newtonsoft C# problem.jsonのダイエット

 AWS Lambda非同期コールや、AWS STEP FUNCTIONでは、payloadサイズが256KB程度に制限されています。具体的には、ソルバーに投げるpayload sizeがこのサイズを超えているとLambdaに届くまえにはじかれてしまいます。SC3GUIでは、1MBのproblem.jsonも普通にありえるので、なるべくこのサイズが、256KB以下になるようにすることが目的です。(サイズを超えたらS3を使います。DynamodbでもItemSizeが制限されているので不適です。)

SC3 GUIでは、Jsonのシリアライザにnewtonsoftを使っています。このオプションを使うことで、ある程度ダイエットが可能です。

<方法1 インテンドなしにする>
#if REDUCE_JSON
            Newtonsoft.Json.JsonSerializerSettings settings = new Newtonsoft.Json.JsonSerializerSettings { Converters = { new CustomDateTimeConverter() },Formatting = Newtonsoft.Json.Formatting.None };
#else
             Newtonsoft.Json.JsonSerializerSettings settings = new Newtonsoft.Json.JsonSerializerSettings { Converters = { new CustomDateTimeConverter() },Formatting = Newtonsoft.Json.Formatting.Indented };//, Forma
#endif


こうすると、読みやすいJSONが

{
  "SO": {
    "name": "Shift Objects",
    "members": [
      {
        "use": true,
        "name": "ShiftDef",
        "def_name": "日勤",
        "auto_schedule": true,
        "color": "LightGray",
        "label": "・",
        "another_labels": [
          "",
          ""
        ],

読みにくくなります。これが一番効果がありました。

{"SO":{"name":"Shift Objects","members":[{"use":true,"name":"ShiftDef","def_name":"日勤","auto_schedule":true,"color":"LightGray","label":"日","another_labels":["",""],"another_colors":

<方法2 default valueを使う。defaultの値を定義しておいて、それと同じだったらJSON化されません。> 方法1と2を用いることで、サイズが1/4から1/5程度になりました。

#if REDUCE_JSON
        [ DefaultValue("")]//OCT042020
        [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
#endif
        public string shift;
        //OCT042020
#if REDUCE_JSON
        [DefaultValue(0)]
        [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
    public int level;
#endif

0 件のコメント:

コメントを投稿