anchor.diff:  
   procedure TJSONObjectHelper.WriteTValue(const AName: string;
     const AValue: TValue);
  +begin
  +  WriteTValue(AName, AValue, DefaultMARSJSONSerializationOptions);
  +end;
  +
  +procedure TJSONObjectHelper.WriteTValue(const AName: string;
  +  const AValue: TValue; const AOptions: TMARSJSONSerializationOptions);
   var
     LValue: TJSONValue;
   begin
     LValue := TValueToJSONValue(AValue);
   
  -  // skip empty string
  -  if Assigned(LValue) and (LValue is TJSONString) and (TJSONString(LValue).Value = '') then
  -  begin
  -    FreeAndNil(LValue);
  -    Exit;
  -  end;
  -
  -    // skip false boolean values
  -  if Assigned(LValue) and (LValue is TJSONBool) and (TJSONBool(LValue).AsBoolean = false) then
  -  begin
  -    FreeAndNil(LValue);
  -    Exit;
  -  end;
  -
  -  // skip empty arrays
  -  if Assigned(LValue) and (LValue is TJSONArray) and (TJSONArray(LValue).Count = 0) then
  -  begin
  -    FreeAndNil(LValue);
  -    Exit;
  -  end;
  -
  -  // skip empty objects
  -  if Assigned(LValue) and (LValue is TJSONObject) and (TJSONObject(LValue).Count = 0) then
  -  begin
  -    FreeAndNil(LValue);
  -    Exit;
  +  if AOptions.SkipEmptyValues then
  +  begin
  +    // skip empty string
  +    if Assigned(LValue) and (LValue is TJSONString) and (TJSONString(LValue).Value = '') then
  +    begin
  +      FreeAndNil(LValue);
  +      Exit;
  +    end;
  +
  +      // skip false boolean values
  +    if Assigned(LValue) and (LValue is TJSONBool) and (TJSONBool(LValue).AsBoolean = false) then
  +    begin
  +      FreeAndNil(LValue);
  +      Exit;
  +    end;
  +
  +    // skip empty arrays
  +    if Assigned(LValue) and (LValue is TJSONArray) and (TJSONArray(LValue).Count = 0) then
  +    begin
  +      FreeAndNil(LValue);
  +      Exit;
  +    end;
  +
  +    // skip empty objects
  +    if Assigned(LValue) and (LValue is TJSONObject) and (TJSONObject(LValue).Count = 0) then
  +    begin
  +      FreeAndNil(LValue);
  +      Exit;
  +    end;
     end;
   
     AddPair(AName, LValue);
  
positive.code:     class procedure TJSONValueToTValue(const AValue: TJSONValue; const ADesiredType: TRttiType; var ATValue: TValue);
    end;
  
    function StringArrayToJsonArray(const AStringArray: TArray<string>): TJSONArray;
    function JsonArrayToStringArray(const AJSONArray: TJSONArray): TArray<string>;
    function IntegerArrayToJsonArray(const AIntegerArray: TArray<Integer>): TJSONArray;
    function JsonArrayToIntegerArray(const AJSONArray: TJSONArray): TArray<Integer>;
  
  implementation
  
  
negative.code:     const AValue: TValue; const AJSONObject: TJSONObject; var AAccept: Boolean);
  
    TJSONRawString = type string;
  
    TMARSJSONSerializationOptions = record
      SkipEmptyValues: Boolean;
    end;
  
  
  {$ifndef DelphiXE6_UP}
    TJSONArrayEnumerator = class
  