2016-08-03 2 views
1

Windows Phone 8.1 응용 프로그램에서 작업 중입니다. 나는 REST API로 작업 중이며 API는 JSON 데이터를 리턴한다. API를 호출 할 때마다 매개 변수로 deserialize 될 클래스 유형을 보내고 deserialized 데이터를 해당 모델의 객체로 가져 오는 등의 메소드를 만들고 싶습니다. 현재 코드는 다음과 같습니다.리플렉션을 사용하여 JSON을 다른 클래스로 비 직렬화

public static async Task GetAPIData(Type referanceModel, string serviceUrl) 
    { 
     HttpClient client = new HttpClient(); 
     var responce = await client.GetAsync(new Uri(serviceUrl)); 
     JArray arr = JArray.Parse(await response.Content.ReadAsStringAsync()); 

     foreach (JObject obj in arr.Children<JObject>()) 
     { 
      JsonSerializerSettings settings = new JsonSerializerSettings(); 
      settings.NullValueHandling = NullValueHandling.Ignore; 
      settings.MissingMemberHandling = MissingMemberHandling.Ignore; 

      var rcvdData = JsonConvert.DeserializeObject<referanceModel>(obj.ToString(), settings); 


      //var method = typeof(JsonConvert).GetTypeInfo().GetDeclaredMethods("DeserializeObject").ToList()[5].MakeGenericMethod(ReferanceModel); 


      //var rcvd = method.Invoke(null, new object[] { obj.ToString(), settings }); 
     } 

    } 

위의 코드는 referanceModel이 변수라는 오류를 보여줍니다. 내가 코멘트 코드를 시도했지만 너무 작동하지 않습니다.

두 클래스는 AllvehData 및 AllDevicesData입니다. 이러한 클래스는 모두 내가 주제에 많이 검색 한 this을 찾았지만 이해하는 데 실패 ThisUser

public class AllVehData 
{ 
    public string Colour { get; set; } 
    public string Make { get; set; } 
    public string model { get; set; } 
    public string Year { get; set; } 


} 


public class AllDevicesData 
{ 
    bool has_tracking_device { get; set; } 
    int drive_type_name_string_id { get; set; } 
    public int vehicle_status { get; set; } 
    public int cargo_capacity { get; set; } 
    public int fuel_capacity { get; set; } 
} 

의 인스턴스와 ThisUserClass라는 단일 클래스 내부에 있습니다. 도움이 필요해.

답변

0

이 경우 일반 과부하 JsonConvert.DeserializeObject<>(string, JsonSerializerSettings)이 필요하지 않습니다. 대신 JsonConvert.DeserializeObject(string, Type, JsonSerializerSettings) 오버로드를 사용하여 수행

var rcvdData = JsonConvert.DeserializeObject(obj.ToString(), referanceModel, settings); 

당신이 제네릭 사용

- 클래스 나 메소드 중 하나가 - 유형 Type의 변수의 반대로 당신이 일반적인 매개 변수의 대신에 실제의 형태를 통과해야합니다. 이것은 컴파일 타임 오류가 발생하는 이유입니다. 예 : 문자열 목록을 초기화하기 위해 당신이 할 수 없습니다

var theStringVar = string.Empty; 
var myList1 = new List<theStringVar>(); // Here we get the compile time error. 

// OR 

var theTypeVar = typeof(string); 
var myList2 = new List<theTypeVar>(); // That won't work either. 

대신 명시 적으로 string 유형을 지정해야합니다 : 나는 메소드를 호출 얼마나

var myList3 = new List<string>(); // This works just fine. 
+0

@BozhdarStoinev 당신이 말해 주 시겠어요. –

+0

예를 들어 ... 직면 한 문제는 무엇입니까? –

+0

Json 파트에 코드를 추가했습니다. rcvdData로 값을 업데이트하지 않습니다. rcvdData는 모든 Null 값을 가진 AllVehData 클래스의 객체가됩니다. –

관련 문제