로직 개선

This commit is contained in:
김형인
2025-06-07 01:53:51 +09:00
parent d0e299585b
commit 4b490d79f4
9 changed files with 671 additions and 58 deletions

View File

@@ -23,11 +23,12 @@ namespace UVC.Data
/// }");
///
/// // Mask 객체 (타입 지정용)
/// var maskJson = JObject.Parse(@"{
/// var maskJson = DataMask.Parse(@"{
/// ""name"": """",
/// ""age"": 0,
/// ""isActive"": false
/// }");
/// maskJson.ObjectIdKey = "name"; // DataObject의 Id로 사용할 속성 지정
///
/// var mapper = new DataMapper(maskJson);
/// DataObject result = mapper.Map(sourceJson);
@@ -42,7 +43,7 @@ namespace UVC.Data
private int maxRecursionDepth = 10;
private int currentDepth = 0;
private JObject mask;
private DataMask mask;
/// <summary>
/// DataMapper 클래스의 새 인스턴스를 초기화합니다.
@@ -52,7 +53,7 @@ namespace UVC.Data
/// Mask 객체는 원본 JSON 객체와 동일한 구조를 가질 필요는 없지만,
/// 변환하려는 속성들에 대한 타입 정보를 제공해야 합니다.
/// </remarks>
public DataMapper(JObject mask)
public DataMapper(DataMask mask)
{
this.mask = mask;
}
@@ -93,10 +94,11 @@ namespace UVC.Data
/// { ""name"": ""이영희"", ""age"": 25 }
/// ]");
///
/// var maskJson = JObject.Parse(@"{
/// var maskJson = DataMask.Parse(@"{
/// ""name"": """",
/// ""age"": 0
/// }");
/// maskJson.ObjectIdKey = "name"; // DataObject의 Id로 사용할 속성 지정
///
/// var mapper = new DataMapper(maskJson);
/// DataArray result = mapper.Map(sourceArray);
@@ -147,7 +149,7 @@ namespace UVC.Data
/// }
/// }");
///
/// var maskJson = JObject.Parse(@"{
/// var maskJson = DataMask.Parse(@"{
/// ""user"": {
/// ""name"": """",
/// ""address"": {
@@ -156,21 +158,22 @@ namespace UVC.Data
/// }
/// }
/// }");
/// maskJson.ObjectIdKey = "user"; // DataObject의 Id로 사용할 속성 지정
///
/// var mapper = new DataMapper(maskJson);
/// var result = mapper.Map(sourceJson);
/// // result는 sourceJson과 동일한 중첩 구조를 유지
/// </code>
/// </example>
private DataObject MapObject(JObject sourceObject, JObject maskObject, int depth = 0)
private DataObject MapObject(JObject sourceObject, DataMask maskObject, int depth = 0)
{
if (depth >= maxRecursionDepth)
{
// 깊이 제한에 도달하면 간소화된 처리
return new DataObject(sourceObject);
return new DataObject(sourceObject) { IdKey = maskObject.ObjectIdKey, Name = maskObject.ObjectName };
}
DataObject target = new DataObject();
DataObject target = new DataObject() { IdKey = maskObject.ObjectIdKey, Name = maskObject.ObjectName };
foreach (var property in sourceObject.Properties())
{
if (maskObject.ContainsKey(property.Name))
@@ -181,7 +184,7 @@ namespace UVC.Data
// 중첩된 객체 처리
if (sourceValue.Type == JTokenType.Object && maskValue.Type == JTokenType.Object)
{
target[property.Name] = MapObject((JObject)sourceValue, (JObject)maskValue, depth + 1);
target[property.Name] = MapObject((JObject)sourceValue, (DataMask)maskValue, depth + 1);
}
// 중첩된 배열 처리
else if (sourceValue.Type == JTokenType.Array && maskValue.Type == JTokenType.Array)
@@ -191,7 +194,12 @@ namespace UVC.Data
}
else
{
MapProperty(property.Name, sourceValue, maskValue, target);
string propertyName = property.Name;
if(maskObject.NamesForReplace != null && maskObject.NamesForReplace.ContainsKey(propertyName))
{
propertyName = maskObject.NamesForReplace[propertyName];
}
MapProperty(propertyName, sourceValue, maskValue, target);
}
}
else
@@ -265,11 +273,12 @@ namespace UVC.Data
/// ]
/// }");
///
/// var maskJson = JObject.Parse(@"{
/// var maskJson = DataMask.Parse(@"{
/// ""contacts"": [
/// { ""type"": """", ""number"": """" }
/// ]
/// }");
/// maskJson.ObjectIdKey = "contacts"; // DataObject의 Id로 사용할 속성 지정
///
/// var mapper = new DataMapper(maskJson);
/// var result = mapper.Map(sourceJson);
@@ -296,7 +305,7 @@ namespace UVC.Data
if (sourceItem.Type == JTokenType.Object && maskTemplate != null && maskTemplate.Type == JTokenType.Object)
{
results[i] = MapObject((JObject)sourceItem, (JObject)maskTemplate);
results[i] = MapObject((JObject)sourceItem, (DataMask)maskTemplate);
}
else
{
@@ -351,7 +360,7 @@ namespace UVC.Data
if (sourceItem.Type == JTokenType.Object && maskTemplate.Type == JTokenType.Object)
{
targetArray.Add(MapObject((JObject)sourceItem, (JObject)maskTemplate));
targetArray.Add(MapObject((JObject)sourceItem, (DataMask)maskTemplate));
}
else if (sourceItem.Type == JTokenType.Array && maskTemplate.Type == JTokenType.Array)
{
@@ -408,7 +417,7 @@ namespace UVC.Data
/// }");
///
/// // Mask 객체 설정 (열거형 포함)
/// var maskJson = new JObject();
/// var maskJson = new DataMask();
/// maskJson["name"] = "";
/// maskJson["age"] = 0;
/// maskJson["height"] = 0.0;
@@ -416,6 +425,8 @@ namespace UVC.Data
/// maskJson["birthDate"] = JToken.FromObject(DateTime.Now);
/// maskJson["status"] = JToken.FromObject(UserStatus.Inactive);
///
/// maskJson.ObjectIdKey = "name"; // DataObject의 Id로 사용할 속성 지정
///
/// var mapper = new DataMapper(maskJson);
/// var result = mapper.Map(sourceJson);
/// // result에는 모든 속성이 적절한 타입으로 변환됨