TIL, WIL/TIL๐Ÿ“˜

09. 25 TIL : Gson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ JsonObject ๊ฐ์ฒด ํ™œ์šฉ ์‹œ ์ฃผ์˜ํ•  ์ 

wannaDevelopIt 2025. 9. 25. 18:00

0. ๋ฌธ์ œ ์ƒํ™ฉ

-> JsonObject์—์„œ String์ธ ๊ฐ’์„ toString() ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•ด ๊ฐ’์„ ์ฐธ์กฐํ–ˆ์ง€๋งŒ, ์™œ์ธ์ง€ \"A\" ์˜ ํ˜•ํƒœ๋กœ ๋ฌธ์ž์—ด ์•ˆ์— ๋”ฐ์˜ดํ‘œ๊นŒ์ง€ ์ถ”๊ฐ€๋œ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค

 

1. ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ

JsonObject.get(memberName).toString() ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•  ์‚ฌํ•ญ

 

๊ฐ€์žฅ ๊ธฐ๋ณธ์ธ Object์˜ toString() ๋ฉ”์„œ๋“œ๋Š”

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

๋กœ์ง์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค

 

์ด ๋กœ์ง์„ ํ†ตํ•ด ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ, ํ•ด๋‹น ๊ฐ์ฒด์˜ "์ฃผ์†Œ"๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค

 

์ด์™€ ๋‹ค๋ฅด๊ฒŒ JsonObject์˜ ๊ฒฝ์šฐ,

 

์ƒ์œ„ ๊ฐ์ฒด์ธ JsonElement์—์„œ ์žฌ์ •์˜ํ•œ toString() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

@Override
  public String toString() {
    try {
      StringWriter stringWriter = new StringWriter();
      JsonWriter jsonWriter = new JsonWriter(stringWriter);
      jsonWriter.setLenient(true);
      Streams.write(this, jsonWriter);
      return stringWriter.toString();
    } catch (IOException e) {
      throw new AssertionError(e);
    }
  }

1) StringWriter ํด๋ž˜์Šค์ธ stringWriter ๊ฐ์ฒด ์ƒ์„ฑ : java.io ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํด๋ž˜์Šค๋กœ, ๋‚ด๋ถ€์—์„œ StringBuffer ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ ์ž‘์—…์„ ํ•œ๋‹ค

2) JsonWriter : stringWriter ๊ฐ์ฒด๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•œ ์ƒˆ๋กœ์šด JsonWrter ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

  public JsonWriter(Writer out) {
    this.out = Objects.requireNonNull(out, "out == null");
  }

-> null ์ฒดํฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•œ๋‹ค

3) jsonWriter.setLenient(true) : 

ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ json ํ‘œ์ค€ ์–‘์‹์„ ์—„๊ฒฉํ•˜๊ฒŒ ์ค€์ˆ˜ํ•  ๊ฒƒ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•œ๋‹ค. true๋กœ ์„ค์ •๋˜๋ฏ€๋กœ, ํ˜•์‹์— ๋งž์ง€์•Š๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ž…๋ ฅ๋  ๊ฒฝ์šฐ JsonParseException ๋“ฑ์˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค

 

4) Streams.write(this, jsonWriter) :

public static void write(JsonElement element, JsonWriter writer) throws IOException {
    TypeAdapters.JSON_ELEMENT.write(writer, element);
  }

ํ•ด๋‹น ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ํ˜ธ์ถœํ•˜๋Š” write ๋ฉ”์„œ๋“œ๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋กœ,
TypeAdapters ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค

@Override public void write(JsonWriter out, JsonElement value) throws IOException {
      if (value == null || value.isJsonNull()) {
        out.nullValue();
      } else if (value.isJsonPrimitive()) {
        JsonPrimitive primitive = value.getAsJsonPrimitive();
        if (primitive.isNumber()) {
          out.value(primitive.getAsNumber());
        } else if (primitive.isBoolean()) {
          out.value(primitive.getAsBoolean());
        } else {
          out.value(primitive.getAsString());
        }

      } else if (value.isJsonArray()) {
        out.beginArray();
        for (JsonElement e : value.getAsJsonArray()) {
          write(out, e);
        }
        out.endArray();

      } else if (value.isJsonObject()) {
        out.beginObject();
        for (Map.Entry<String, JsonElement> e : value.getAsJsonObject().entrySet()) {
          out.name(e.getKey());
          write(out, e.getValue());
        }
        out.endObject();

      } else {
        throw new IllegalArgumentException("Couldn't write " + value.getClass());
      }
    }
  };

JsonObject์˜ ๊ฒฝ์šฐ, ๊ธฐ์กด JsonElement์˜ entrySet()๋ฅผ ์ˆœํ™˜ํ•˜๋ฉด์„œ jsonWriter ๊ฐ์ฒด๋ฅผ ํ™œ์šฉ value(JsonElement)์˜ key๋Š” out.name() ๋ฉ”์„œ๋“œ๋กœ, value๋Š” write() ์žฌ๊ท€ ํ˜ธ์ถœ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ํ†ตํ•ด ์ง๋ ฌํ™”ํ•œ๋‹ค

-> ** ์ด ๊ณผ์ •์—์„œ jsonWriter ๊ฐ์ฒด๋Š” JSON ํ‘œ์ค€๊ทœ๊ฒฉ์„ ์ค€์ˆ˜ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๊ธฐ์กด ๋ฐ์ดํ„ฐ์— ๋”ฐ์˜ดํ‘œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค

์ฆ‰, JsonObejct.get(memberName).toString()์€ ๋”ฐ์˜ดํ‘œ๋ฅผ ํ•œ๋ฒˆ ๋” ์”Œ์šฐ๋Š” ๊ฒƒ์ด๋‹ค

 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ์›ํ•˜๋Š” ๊ฐ’์„ ์œ„ํ•ด์„  

 

JsonObejct.get(memberName).getAsString(); ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค