001/* 002 * Copyright 2015-2024 Ping Identity Corporation 003 * All Rights Reserved. 004 */ 005/* 006 * Copyright 2015-2024 Ping Identity Corporation 007 * 008 * Licensed under the Apache License, Version 2.0 (the "License"); 009 * you may not use this file except in compliance with the License. 010 * You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, software 015 * distributed under the License is distributed on an "AS IS" BASIS, 016 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 017 * See the License for the specific language governing permissions and 018 * limitations under the License. 019 */ 020/* 021 * Copyright (C) 2015-2024 Ping Identity Corporation 022 * 023 * This program is free software; you can redistribute it and/or modify 024 * it under the terms of the GNU General Public License (GPLv2 only) 025 * or the terms of the GNU Lesser General Public License (LGPLv2.1 only) 026 * as published by the Free Software Foundation. 027 * 028 * This program is distributed in the hope that it will be useful, 029 * but WITHOUT ANY WARRANTY; without even the implied warranty of 030 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 031 * GNU General Public License for more details. 032 * 033 * You should have received a copy of the GNU General Public License 034 * along with this program; if not, see <http://www.gnu.org/licenses>. 035 */ 036package com.unboundid.util.json; 037 038 039 040import com.unboundid.util.NotMutable; 041import com.unboundid.util.NotNull; 042import com.unboundid.util.Nullable; 043import com.unboundid.util.ThreadSafety; 044import com.unboundid.util.ThreadSafetyLevel; 045 046 047 048/** 049 * This class provides an implementation of a JSON value that represents a null 050 * value. The string representation of the null value is {@code null} in all 051 * lowercase and without any quotation marks. 052 */ 053@NotMutable() 054@ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE) 055public final class JSONNull 056 extends JSONValue 057{ 058 /** 059 * A pre-allocated JSON null value object. 060 */ 061 @NotNull public static final JSONNull NULL = new JSONNull(); 062 063 064 065 /** 066 * The serial version UID for this serializable class. 067 */ 068 private static final long serialVersionUID = -8359265286375144526L; 069 070 071 072 /** 073 * Creates a new JSON value capable of representing a {@code null} value. 074 */ 075 public JSONNull() 076 { 077 } 078 079 080 081 /** 082 * {@inheritDoc} 083 */ 084 @Override() 085 public int hashCode() 086 { 087 return 1; 088 } 089 090 091 092 /** 093 * {@inheritDoc} 094 */ 095 @Override() 096 public boolean equals(@Nullable final Object o) 097 { 098 return ((o == this) || (o instanceof JSONNull)); 099 } 100 101 102 103 /** 104 * {@inheritDoc} 105 */ 106 @Override() 107 public boolean equals(@NotNull final JSONValue v, 108 final boolean ignoreFieldNameCase, 109 final boolean ignoreValueCase, 110 final boolean ignoreArrayOrder) 111 { 112 return (v instanceof JSONNull); 113 } 114 115 116 117 /** 118 * Retrieves a string representation of this null value as it should appear 119 * in a JSON object. Null values will always have a string representation of 120 * "{@code null}" (without the surrounding quotes). 121 * 122 * @return A string representation of this null value as it should appear 123 * in a JSON object. 124 */ 125 @Override() 126 @NotNull() 127 public String toString() 128 { 129 return "null"; 130 } 131 132 133 134 /** 135 * Appends a string representation of this null value as it should appear 136 * in a JSON object to the provided buffer. Null values will always have a 137 * string representation of "{@code null}" (without the surrounding quotes). 138 * 139 * @param buffer The buffer to which the information should be appended. 140 */ 141 @Override() 142 public void toString(@NotNull final StringBuilder buffer) 143 { 144 buffer.append("null"); 145 } 146 147 148 149 /** 150 * Retrieves a single-line string representation of this null value as it 151 * should appear in a JSON object. Null values will always have a string 152 * representation of "{@code null}" (without the surrounding quotes). 153 * 154 * @return A single-line string representation of this null value as it 155 * should appear in a JSON object. 156 */ 157 @Override() 158 @NotNull() 159 public String toSingleLineString() 160 { 161 return "null"; 162 } 163 164 165 166 /** 167 * Appends a single-line string representation of this null value as it should 168 * appear in a JSON object to the provided buffer. Null values will always 169 * have a string representation of "{@code null}" (without the surrounding 170 * quotes). 171 * 172 * @param buffer The buffer to which the information should be appended. 173 */ 174 @Override() 175 public void toSingleLineString(@NotNull final StringBuilder buffer) 176 { 177 buffer.append("null"); 178 } 179 180 181 182 /** 183 * Retrieves a normalized string representation of this null value as it 184 * should appear in a JSON object. Null values will always have a string 185 * representation of "{@code null}" (without the surrounding quotes). 186 * 187 * @return A normalized string representation of this null value as it 188 * should appear in a JSON object. 189 */ 190 @Override() 191 @NotNull() 192 public String toNormalizedString() 193 { 194 return "null"; 195 } 196 197 198 199 /** 200 * Appends a normalized string representation of this null value as it should 201 * appear in a JSON object to the provided buffer. Null values will always 202 * have a string representation of "{@code null}" (without the surrounding 203 * quotes). 204 * 205 * @param buffer The buffer to which the information should be appended. 206 */ 207 @Override() 208 public void toNormalizedString(@NotNull final StringBuilder buffer) 209 { 210 buffer.append("null"); 211 } 212 213 214 215 /** 216 * Retrieves a normalized string representation of this null value as it 217 * should appear in a JSON object. Null values will always have a string 218 * representation of "{@code null}" (without the surrounding quotes). 219 * 220 * @param ignoreFieldNameCase Indicates whether field names should be 221 * treated in a case-sensitive (if {@code false}) 222 * or case-insensitive (if {@code true}) manner. 223 * @param ignoreValueCase Indicates whether string field values should 224 * be treated in a case-sensitive (if 225 * {@code false}) or case-insensitive (if 226 * {@code true}) manner. 227 * @param ignoreArrayOrder Indicates whether the order of elements in an 228 * array should be considered significant (if 229 * {@code false}) or insignificant (if 230 * {@code true}). 231 * 232 * @return A normalized string representation of this null value as it 233 * should appear in a JSON object. 234 */ 235 @Override() 236 @NotNull() 237 public String toNormalizedString(final boolean ignoreFieldNameCase, 238 final boolean ignoreValueCase, 239 final boolean ignoreArrayOrder) 240 { 241 return "null"; 242 } 243 244 245 246 /** 247 * Appends a normalized string representation of this null value as it should 248 * appear in a JSON object to the provided buffer. Null values will always 249 * have a string representation of "{@code null}" (without the surrounding 250 * quotes). 251 * 252 * @param buffer The buffer to which the information should be 253 * appended. 254 * @param ignoreFieldNameCase Indicates whether field names should be 255 * treated in a case-sensitive (if {@code false}) 256 * or case-insensitive (if {@code true}) manner. 257 * @param ignoreValueCase Indicates whether string field values should 258 * be treated in a case-sensitive (if 259 * {@code false}) or case-insensitive (if 260 * {@code true}) manner. 261 * @param ignoreArrayOrder Indicates whether the order of elements in an 262 * array should be considered significant (if 263 * {@code false}) or insignificant (if 264 * {@code true}). 265 */ 266 @Override() 267 public void toNormalizedString(@NotNull final StringBuilder buffer, 268 final boolean ignoreFieldNameCase, 269 final boolean ignoreValueCase, 270 final boolean ignoreArrayOrder) 271 { 272 buffer.append("null"); 273 } 274 275 276 277 /** 278 * {@inheritDoc} 279 */ 280 @Override() 281 @NotNull() 282 public JSONNull toNormalizedValue(final boolean ignoreFieldNameCase, 283 final boolean ignoreValueCase, 284 final boolean ignoreArrayOrder) 285 { 286 // Null values are always in normalized form. 287 return this; 288 } 289 290 291 292 /** 293 * {@inheritDoc} 294 */ 295 @Override() 296 public void appendToJSONBuffer(@NotNull final JSONBuffer buffer) 297 { 298 buffer.appendNull(); 299 } 300 301 302 303 /** 304 * {@inheritDoc} 305 */ 306 @Override() 307 public void appendToJSONBuffer(@NotNull final String fieldName, 308 @NotNull final JSONBuffer buffer) 309 { 310 buffer.appendNull(fieldName); 311 } 312}