JSON == Null 해결
- 프로젝트에서
_solution_
과 Debug Log 를 Switch 매칭 시켜서 해당 문자열을 출력하는 로직 구현 - 첫번째
ModifyVariables
를 제외하고는 나머지 항목에 대해서는 Null이 나오는 상황
JSON Data
[
{
"ModifyVariables" :
[
"변수 범위를 재조정하고 있습니다. 예상치 못한 값 할당을 방지하기 위해 범위를 체크합니다.",
"변수 할당 값이 올바른지 확인하고, 필요한 경우 수정을 진행하고 있습니다.",
"데이터 타입 불일치 문제를 발견하여, 타입을 적절하게 변경하고 있습니다.",
"글로벌 변수의 사용이 과도하게 이루어지고 있었습니다. 변수의 범위와 접근을 최적화하고 있습니다.",
"변수명을 재검토하여, 혼란을 줄 수 있는 부분을 수정하고 있습니다."
]
},
{
"FixTypos" :
[
"오타를 찾아 수정하는 과정에서 코드의 정확성을 향상시키고 있습니다.",
"메소드 이름에 오타가 있었습니다. 정확한 이름으로 수정하여 연결 오류를 해결했습니다.",
"변수 이름이 잘못되어 컴파일 에러가 발생했습니다. 올바른 이름으로 수정하였습니다.",
"문자열 리터럴에 오타를 발견하여, 예상된 출력값과 일치하도록 수정했습니다.",
"문법적 오류로 인해 코드가 컴파일되지 않았습니다. 오류를 수정하여 정상 작동하도록 했습니다."
]
},
{
"ModifyScope" :
[
"변수와 함수의 스코프가 적절하지 않아 문제가 발생했습니다. 범위를 조정하여 해결했습니다.",
"접근 제한자가 잘못 설정되어 보안 문제가 우려되었습니다. 적절한 수준으로 재설정하였습니다.",
"중첩된 스코프 내에서 변수 사용에 혼란이 있었습니다. 명확하게 구분하여 오류를 해결했습니다.",
"메소드와 클래스의 가시성 문제로 인해 필요한 곳에서 사용할 수 없었습니다. 가시성을 조정하여 접근성을 개선했습니다.",
"블록 내부에서 선언된 변수가 외부에서 접근되는 문제를 발견하여, 스코프를 명확히 구분했습니다."
]
},
{
"EditPath" :
[
"파일 경로가 잘못 지정되어 파일을 찾을 수 없었습니다. 올바른 경로로 수정하였습니다.",
"리소스 경로 설정이 잘못되어 필요한 자원을 불러오지 못했습니다. 정확한 경로로 수정했습니다.",
"URL 형식이 잘못되어 네트워크 요청이 실패하고 있었습니다. URL을 정정하여 문제를 해결했습니다.",
"상대 경로와 절대 경로의 혼용으로 인해 파일 위치를 찾지 못했습니다. 경로를 명확하게 구분하였습니다.",
"경로 구분자 사용이 일관되지 않아, 플랫폼 간 호환성에 문제가 있었습니다. 올바른 구분자를 사용하여 수정했습니다."
]
},
{
"CheckMemory" :
[
"메모리 누수를 발견하여 해결하고 있습니다. 누수 원인을 파악하여 메모리를 정상적으로 해제하고 있습니다.",
"가비지 컬렉션의 빈번한 발생으로 성능 저하가 발생하고 있었습니다. 객체 사용을 최적화하여 문제를 해결했습니다.",
"널 참조 예외가 발생하여 프로그램이 중단되는 문제를 수정했습니다. 참조되지 않은 객체를 적절히 처리하였습니다.",
"버퍼 오버플로우로 인한 보안 취약점을 발견하여, 메모리 할당을 안전하게 조정했습니다.",
"메모리 할당이 과도하여 시스템 자원을 비효율적으로 사용하고 있었습니다. 메모리 사용을 효율화하여 성능을 개선했습니다."
]
}
]
출력 결과
원인찾기
1. Json 역직렬화
-
Debug
기능을 이용해서 Json 데이터를 정확히 잃어 들이는지 확인
- 데이터 할당을 정상적으로 진행 된것을 확인
2. 데이터 매칭 및 매핑
- 해당 데이터를 할당하는 위치에서
Debug
확인
- ModifyVariables 는 정상적으로 데이터 확인
- FixTypos 부터는 Null 발생
3. 메서드 확인
- JSON 데이터를 확인하기 위해 사용한 LINQ 메서드 확인
LoggingText loggingText = _loggingText.First();
First() 의 경우 컬렉션의 첫번째 요소를 반환하며, 조건이 있을 경우 해당 조건의 첫번째를 반환하는 LINQ
SolutionTypes.FixTypos => loggingText.FixTypos,
- 위의 경우에는
_loggingText
의 각 Key가 매치되면 첫번째 값을 가져오는 것으로 예상을 하고 작성 - 하지만 첫번째 값이 ModifyVariables 를 제외하고는 모두 가져오지 못하는 상황
해결
JSON 객체 구조
- JSON 객체가 별도의 각각의 객체로 분리 구성 되어있어
First()
를 사용하면 - 해당 객체의 첫번째인 ModifyVariables만 가져올 수 있는 문제
데이터 접근
- 각 객체로 접근 해져있기 때문에 별도의 로직이 추가적으로 더 필요
수정된 JSON 파일
- 모든 타입이 하나의 객체로 묶일 수 있도록 수정
[
{
"ModifyVariables" :
[
"변수 범위를 재조정하고 있습니다. 예상치 못한 값 할당을 방지하기 위해 범위를 체크합니다.",
"변수 할당 값이 올바른지 확인하고, 필요한 경우 수정을 진행하고 있습니다.",
"데이터 타입 불일치 문제를 발견하여, 타입을 적절하게 변경하고 있습니다.",
"글로벌 변수의 사용이 과도하게 이루어지고 있었습니다. 변수의 범위와 접근을 최적화하고 있습니다.",
"변수명을 재검토하여, 혼란을 줄 수 있는 부분을 수정하고 있습니다."
],
"FixTypos" :
[
"오타를 찾아 수정하는 과정에서 코드의 정확성을 향상시키고 있습니다.",
"메소드 이름에 오타가 있었습니다. 정확한 이름으로 수정하여 연결 오류를 해결했습니다.",
"변수 이름이 잘못되어 컴파일 에러가 발생했습니다. 올바른 이름으로 수정하였습니다.",
"문자열 리터럴에 오타를 발견하여, 예상된 출력값과 일치하도록 수정했습니다.",
"문법적 오류로 인해 코드가 컴파일되지 않았습니다. 오류를 수정하여 정상 작동하도록 했습니다."
],
"ModifyScope" :
[
"변수와 함수의 스코프가 적절하지 않아 문제가 발생했습니다. 범위를 조정하여 해결했습니다.",
"접근 제한자가 잘못 설정되어 보안 문제가 우려되었습니다. 적절한 수준으로 재설정하였습니다.",
"중첩된 스코프 내에서 변수 사용에 혼란이 있었습니다. 명확하게 구분하여 오류를 해결했습니다.",
"메소드와 클래스의 가시성 문제로 인해 필요한 곳에서 사용할 수 없었습니다. 가시성을 조정하여 접근성을 개선했습니다.",
"블록 내부에서 선언된 변수가 외부에서 접근되는 문제를 발견하여, 스코프를 명확히 구분했습니다."
],
"EditPath" :
[
"파일 경로가 잘못 지정되어 파일을 찾을 수 없었습니다. 올바른 경로로 수정하였습니다.",
"리소스 경로 설정이 잘못되어 필요한 자원을 불러오지 못했습니다. 정확한 경로로 수정했습니다.",
"URL 형식이 잘못되어 네트워크 요청이 실패하고 있었습니다. URL을 정정하여 문제를 해결했습니다.",
"상대 경로와 절대 경로의 혼용으로 인해 파일 위치를 찾지 못했습니다. 경로를 명확하게 구분하였습니다.",
"경로 구분자 사용이 일관되지 않아, 플랫폼 간 호환성에 문제가 있었습니다. 올바른 구분자를 사용하여 수정했습니다."
],
"CheckMemory" :
[
"메모리 누수를 발견하여 해결하고 있습니다. 누수 원인을 파악하여 메모리를 정상적으로 해제하고 있습니다.",
"가비지 컬렉션의 빈번한 발생으로 성능 저하가 발생하고 있었습니다. 객체 사용을 최적화하여 문제를 해결했습니다.",
"널 참조 예외가 발생하여 프로그램이 중단되는 문제를 수정했습니다. 참조되지 않은 객체를 적절히 처리하였습니다.",
"버퍼 오버플로우로 인한 보안 취약점을 발견하여, 메모리 할당을 안전하게 조정했습니다.",
"메모리 할당이 과도하여 시스템 자원을 비효율적으로 사용하고 있었습니다. 메모리 사용을 효율화하여 성능을 개선했습니다."
]
}
]
두번째가 가능하도록 하려면
- 각 JSON 데이터를 객체로 분리하여 순회하는 로직을 만들고 이를 다시 랜덤하게 출력하는 로직이 필요
private static void PlayerLoggingDisplay(SolutionTypes solutionType)
{
foreach (var loggingText in _loggingText)
{
List<string> logs = solutionType switch
{
SolutionTypes.ModifyVariables => loggingText.ModifyVariables,
SolutionTypes.FixTypos => loggingText.FixTypos,
SolutionTypes.ModifyScope => loggingText.ModifyScope,
SolutionTypes.EditPath => loggingText.EditPath,
SolutionTypes.CheckMemory => loggingText.CheckMemory,
_ => new List<string>()
};
foreach (var log in logs)
{
Console.WriteLine(log);
}
}
}