0

의 목록을 열거 할 때 나는 다음 각 하나를 반복하고 일부 약간의 로직을 수행 예외는 사용자 정의 유형

List<MyType> a = JsonConvert.DeserializeObject<List<MyType>>(jsonstringa); 
List<MyType> b = JsonConvert.DeserializeObject<List<MyType>>(jsonstringb); 
JSON의 직렬화를 통해 채워지는 두 개의 목록이 발생합니다. 이 콜렉션들이 비어있는 것은 전적으로 그 이유입니다.

foreach (MyType myA in a) 
{ 
    //DO STUFF HERE 
} 
foreach (MyType myB in b) 
{ 
    //DO STUFF HERE 
} 

컬렉션에 항목이있는 경우에도 문제가 없습니다. 그러나 목록 B에 항목이 없을 때 "foreach"줄에 "Throw Exception"개체의 인스턴스로 설정되지 않은 개체 참조가 나타납니다.

if (a.Count > 0) 
{ 
    foreach (MyType myA in a) 
    { 
     //DO STUFF HERE 
    } 
} 
if (b.Count > 0) 
{ 
    foreach (MyType myB in b) 
    { 
     //DO STUFF HERE 
    } 
} 

: 이것은, 그러나, 나는 한 단계 더 그것을 가져다가 단지뿐만 아니라 안전을 위해 위의 코드를 변경는 다음과 같아야 이 목록 A.

발생하지 않습니다 "A"목록을 통한 반복은 빈 콜렉션이든 엘리먼트를 가지고 있든간에 괜찮습니다. 컬렉션에 요소가있는 경우 "B"목록을 반복하여 다시 처리하지만 이번에는 (myB.Count) > 0 행을 제외하고 동일한 예외가 다시 발생합니다. 디버깅을 통해 두 컬렉션의 Count 속성은 컬렉션이 비었을 때 '0'을 나타냅니다 (예상했던대로).

namespace MyApp.Models 
{ 
    public class MyType 
    { 
     public int ID { get; set; } 
     public string Code { get; set; } 
     public int ParentID { get; set; } 

     [ScriptIgnore(ApplyToOverrides = true)] 
     [JsonIgnore] 
     public virtual Parent Parent { get; set; } 

     public MyType() 
     { 
      ID = 0; 
      Code = null; 
      ParentID = 0; 
     } 
    } 
} 

나는 손실에 조금 해요 :

사용자 지정 "합니다 MyType"클래스는 다음과 같은 선언이 아닌 모든 가상 변수 기본 생성자가 있습니다. 나도 여기에 실패하는 다른 사용자 지정 형식을 가지고 있지만 사실 하나의 동일한 유형의 페어링과 예외를 던지는 것은 모두 의심스럽고 다른 사람이이 동작에 대한 통찰력을 줄 수 있도록 도와줍니다.

+0

은 사실 myB입니다. – JMarsch

+0

당신은 "디버깅을 통해 두 컬렉션의 Count 속성이 '0'으로 표시됩니다. 'myB.Count'를 watch 식으로 정의하고 0을 가졌다는 것을 의미합니까?하지만 실행을 계속하면'if (myB.Count> 0)'가 에러를 던집니다. 위의 코드에서 – DadyFuji

+0

은 a.Aut를 의미하지 않습니다 .Count 대신 myA.Count가 목록이거나 myA 목록입니까? –

답변

1

myB의 경우는 null입니다 myB.Count 처음 널 확인해야 exception.You가 발생합니다 :

if(myB != null && myB.Count > 0) 

당신은 또한 안전을 위해, 첫 번째 목록 그렇게 할 수 있습니다 ... 그리고 당신이를 제거 할 수 있습니다 Count 수표, 불필요합니다. 컬렉션이 경우 foreach는 컬렉션에 foreach 전화 GetEnumerator 방법은 예외의 원인이되는 때문에 당신이 수집을 반복 할 때 그것은 단지 발생, 예외를 throw하지 않습니다.

+0

이 경우 왜 null인지 설명 할 수 있습니까? deserialization은 디버깅을 단계별로 실행할 때 null과 반대로 빈 콜렉션을 반환하는 것으로 나타나며 "myA"유형의 경우 인 것처럼 보입니다. 따라서 예외 호출이 없습니다. 실행을 계속할 수있는 것처럼 보이지만 그 이상을 설명하지는 않습니다. – TheQ

+0

나도 몰라. 만약 컬렉션이 비어 있다면 foreach는 예외를 던지지 않는다. –

0

a 또는 b이 null 인 경우 함수를 호출 할 수 없습니다. null 참조 예외가 발생합니다. 그래서 그들이 null인지 확인하십시오.

if(a !=null) 
{ 
    foreach (MyType myA in a) 
    { 
     //DO STUFF HERE 
    } 
} 

foreach 표현하기 전에 수를 확인하는 명시 적 필요가 없습니다. 비어 있으면 기본적으로 루프를 건너 뜁니다.

0

ab이 결코 null이 아닌 것으로 가정합니다. 입력이 json이 아니거나 유형 정의에 대한 구조와 크게 다른 경우 해당 참조는 null이 될 것이고 null을 반복 할 때 충돌합니다.

당신은 당신이 당신이 당신은 nullforeach 때문에이 암시 적으로 공급에 GetEnumerator()를 호출하는 컬렉션을 반복 할 수 DeserializeObject<T>

0

에서 할당 할 무효 확인 언제 어떻게해야 그 문제에 대해, 컬렉션의 각 if (a != null) // iterate 필요 IEnumerable 인수 b에 기본값을 할당하거나 foreach 절에서 기본값을 사용하기 전에 null이 아닌지 확인해야합니다.

if ((b != null) && (b.Count > 0)) 
{ 
    foreach (MyType myB in b) 
    { 
     //DO STUFF HERE 
    } 
} 
0

저는 jsonstringa 값이나 jsonstringb 값이 무엇인지 알지 못합니다. 나는 아이템이 없을 때 jsonstringb가 빈 문자열이라는 것을 추측 할 것이다. 빈 문자열은 잘못된 JSON 문자열로 간주됩니다.

JsonConvert.DeserializeObject 

잘못된 형식의 JSON 문자열이 지정된 경우 null이 아닌 빈 목록이 반환됩니다. 즉, jsonstringb의 형식이 잘못되었거나 빈 문자열 인 경우 b는 null입니다. 그래서 당신이 b.Count를 요구하거나 foreach를 b (foreach는 b에서 GetEnumerator 메소드를 호출 할 때마다)를 요구할 때마다 null 참조 예외가 발생합니다. 따라서 다음을 수행하여 jsonstringb의 값을 확인한 다음 JsonConvert.DeserializeObject를 호출하십시오.이 값이 비어 있지 않은지 확인하십시오.

if(string.IsNullOrEmpty(jsonstringb)){ 
    jsonstringb = "[]"; 
} 

List<MyType> b = JsonConvert.DeserializeObject<List<MyType>>(jsonstringb); 

를 호출하고 목록에서 루프 또는 호출 방법을하기 전에 널 (null)에 대한 검사를 수행하는 것을 잊지 마세요. 모음 (모든 요소 없음 사용하는 것입니다 경우

if (b!=null){ 
//Your loop or Count here! 
}; 

또 다른 방법은 대신 백작의) 확인합니다.

if(b.Any()){ 
//you have elements in b 
}