Newtonsoft.json: ๋ณ€ํ™˜๊ธฐ์—์„œ ์ƒ์œ„ ๊ฐœ์ฒด์— ์•ก์„ธ์Šค

์— ๋งŒ๋“  2017๋…„ 12์›” 18์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: JamesNK/Newtonsoft.Json

์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ ์˜ˆ์ œ

NewtonSoft JsonConverter - ๋‹ค๋ฅธ ์†์„ฑ์— ์•ก์„ธ์Šค

๋ฌธ์ œ

JsonConverter์—์„œ ๋ถ€๋ชจ ๊ฐœ์ฒด์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ง๋ ฌํ™”๋˜๋Š” ๊ฐœ์ฒด๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐ ์˜์กดํ•˜๋Š” ๋ณ€ํ™˜๊ธฐ์˜ ์ถœ๋ ฅ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋‚ด ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” ์†์„ฑ์— ๋Œ€ํ•œ JSON ์ถœ๋ ฅ์„ ํ†ตํ™” ๋ฌธ์ž์—ด๋กœ ํ˜•์‹ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํฌํ•จํ•˜๋Š” ๊ฐœ์ฒด ๋‚ด์— ์ €์žฅ๋œ ๋ฌธํ™”๊ถŒ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด

public class Contract {
   [JsonIgnore]
   public CultureInfo Culture {get; set;}

   [JsonConverter(typeof(CurrencyConverter))]
   public decimal Cost {get;set;}

   // Lots of additional properties with serialization controlled by attributes.
}

๊ณ„์•ฝ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ JSON [{ Cost : "ยฃ5000.00"}, { Cost : "$8000.00"}, { Cost : "โ‚ฌ599.00"}] ์„ ์–ป์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ๋œ ์†”๋ฃจ์…˜

JsonSerializeWriter์˜ _serializerStack์„ WriteJson์— ์ „๋‹ฌ๋œ ์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ ๊ฐœ์ฒด์˜ ๊ณต์šฉ ์†์„ฑ์œผ๋กœ ReadOnlyCollection์œผ๋กœ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@JonHanna ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ ๋™์ž‘์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ํฌํ•จํ•˜๋Š” ๊ฐœ์ฒด์˜ ๋ชจ๋“  ์†์„ฑ ๋ณ€ํ™˜์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ Contract ์— Vendor ๊ฐ€ ๋งŽ๊ณ  ๊ฐ๊ฐ Asset ๊ฐ€ ๋งŽ๊ณ  Asset ์— ๋น„์šฉ ํ•„๋“œ์— ๋”ฐ๋ผ ํ˜•์‹ํ™”๋œ ์ถœ๋ ฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ Contract Culture์˜ ๊ฒฝ์šฐ Contract ์— ๋Œ€ํ•œ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ž‘์„ฑํ•œ ๋‹ค์Œ ๋ชจ๋“  ํ•˜์œ„ ์†์„ฑ์„ ์ง๋ ฌํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฐ„๋‹จํ•œ ๋ณ€ํ™˜๊ธฐ๊ฐ€ ํ•ด๋‹น ๋ฌธํ™”๊ถŒ์„ ์ฐพ๊ณ  ์ถœ๋ ฅ ํ˜•์‹์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ง๋ ฌํ™” ํŠธ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€ํ™˜๊ธฐ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

DTO ๊ฐœ์ฒด๋Š” ๋™์ž‘์„ ์ •์˜ํ•˜๋Š” ์†์„ฑ์œผ๋กœ ๋น„๊ต์  ๊นจ๋—ํ•˜๊ณ  ๋ณ€ํ™˜๊ธฐ๋„ ๋ชจ๋“  ์ถ”๊ฐ€ ์†์„ฑ์„ ๋งคํ•‘ํ•  ํ•„์š” ์—†์ด ๋น„๊ต์  ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌ๋œ JsonSerializer ์—์„œ GetInternalSerializer() ๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ ๊ฐœ์ธ _serializerStack ํ•„๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ž‘๋™ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. JsonSerializerInternalWriter ๊ฐ€ "_serializerStack" ํ•„๋“œ๋ฅผ JsonSerializer ๋„ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ์œผ๋กœ ๋…ธ์ถœํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‚ด ์ œ์•ˆ์€ ๋‚ด๋ถ€๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ์ฝ๊ธฐ ์ „์šฉ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  3 ๋Œ“๊ธ€

๋ณ€ํ™˜๊ธฐ์˜ ์ถœ๋ ฅ์ด ํฌํ•จ ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒฝ์šฐ ํฌํ•จ ์œ ํ˜•์ด ๋ณ€ํ™˜๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@JonHanna ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ ๋™์ž‘์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ํฌํ•จํ•˜๋Š” ๊ฐœ์ฒด์˜ ๋ชจ๋“  ์†์„ฑ ๋ณ€ํ™˜์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ Contract ์— Vendor ๊ฐ€ ๋งŽ๊ณ  ๊ฐ๊ฐ Asset ๊ฐ€ ๋งŽ๊ณ  Asset ์— ๋น„์šฉ ํ•„๋“œ์— ๋”ฐ๋ผ ํ˜•์‹ํ™”๋œ ์ถœ๋ ฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ Contract Culture์˜ ๊ฒฝ์šฐ Contract ์— ๋Œ€ํ•œ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ž‘์„ฑํ•œ ๋‹ค์Œ ๋ชจ๋“  ํ•˜์œ„ ์†์„ฑ์„ ์ง๋ ฌํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฐ„๋‹จํ•œ ๋ณ€ํ™˜๊ธฐ๊ฐ€ ํ•ด๋‹น ๋ฌธํ™”๊ถŒ์„ ์ฐพ๊ณ  ์ถœ๋ ฅ ํ˜•์‹์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ง๋ ฌํ™” ํŠธ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€ํ™˜๊ธฐ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

DTO ๊ฐœ์ฒด๋Š” ๋™์ž‘์„ ์ •์˜ํ•˜๋Š” ์†์„ฑ์œผ๋กœ ๋น„๊ต์  ๊นจ๋—ํ•˜๊ณ  ๋ณ€ํ™˜๊ธฐ๋„ ๋ชจ๋“  ์ถ”๊ฐ€ ์†์„ฑ์„ ๋งคํ•‘ํ•  ํ•„์š” ์—†์ด ๋น„๊ต์  ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌ๋œ JsonSerializer ์—์„œ GetInternalSerializer() ๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ ๊ฐœ์ธ _serializerStack ํ•„๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ž‘๋™ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. JsonSerializerInternalWriter ๊ฐ€ "_serializerStack" ํ•„๋“œ๋ฅผ JsonSerializer ๋„ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ์œผ๋กœ ๋…ธ์ถœํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‚ด ์ œ์•ˆ์€ ๋‚ด๋ถ€๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ์ฝ๊ธฐ ์ „์šฉ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ง๋ ฌํ™”์— ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ์ด ์ง๋ ฌํ™” ์Šคํƒ์— ๋„๋‹ฌํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์ถฉ๋Œ์‹œํ‚ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์•„๋‹ˆ๋ฉด ์ง€๊ธˆ๊นŒ์ง€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰