2016-10-25 4 views
2

Я хотел бы видеть некоторые из ваших предложений о том, как строить объекты в C#, чтобы соответствовать этому JSonПреобразовать Json объект объекта

{ 
"activities-heart": [ 
    { 
     "dateTime": "2016-10-25", 
     "value": { 
     "customHeartRateZones": [], 
     "heartRateZones": [ 
      { 
      "max": 88, 
      "min": 30, 
      "name": "Out of Range" 
      }, 
      { 
      "max": 123, 
      "min": 88, 
      "name": "Fat Burn" 
      }, 
      { 
      "max": 150, 
      "min": 123, 
      "name": "Cardio" 
      }, 
      { 
      "max": 220, 
      "min": 150, 
      "name": "Peak" 
      } 
     ] 
     } 
    } 
    ], 
    "activities-heart-intraday": { 
    "dataset": [], 
    "datasetInterval": 1, 
    "datasetType": "minute" 
    } 
} 

This Site предложил:

public class HeartRateZone 
{ 
    public int max { get; set; } 
    public int min { get; set; } 
    public string name { get; set; } 
} 

public class Value 
{ 
    public List<object> customHeartRateZones { get; set; } 
    public List<HeartRateZone> heartRateZones { get; set; } 
} 

public class ActivitiesHeart 
{ 
    public string dateTime { get; set; } 
    public Value value { get; set; } 
} 

public class ActivitiesHeartIntraday 
{ 
    public List<object> dataset { get; set; } 
    public int datasetInterval { get; set; } 
    public string datasetType { get; set; } 
} 

public class RootObject 
{ 
    public List<ActivitiesHeart> __invalid_name__activities-heart { get; set; } 
    public ActivitiesHeartIntraday __invalid_name__activities-heart-intraday { get; set; } 
} 

Моя проблема заключается в том, что это ничего не возвращает, он пытается создать сущности, но они являются нулевыми. Есть что-то, что конвертер и я не вижу.

+1

try NewtonSoft Json dll –

+4

Вы можете показать код десериализации? –

+2

* «Моя проблема в том, что это ничего не возвращает, он пытается создать сущности, но они являются нулевыми». * Ничего не возвращает, когда? Где ваш код для десериализации JSON? –

ответ

2

Предполагая, что вы используете NewtonSoft, чтобы десериализовать json (и довольно уверенно, что следующее в других десериализаторах), проблема связана с вашими классами.

Если для ваших классов я запустил следующую строку, как вы описали, я получаю значения null в свойствах.

var result = JsonConvert.DeserializeObject<RootObject>(jsonString); 

Теперь, если вы посмотрите на классы у вас есть они даже не компилировать:

public class RootObject 
{ 
    public List<ActivitiesHeart> __invalid_name__activities-heart { get; set; } 
    public ActivitiesHeartIntraday __invalid_name__activities-heart-intraday { get; set; } 
} 

И сайт даже сказал вам, что имена свойств являются недействительными: __invalid_name__activities-heart , Вы не можете иметь имена свойств с - в них ..

Чтобы исправить это вам нужно:

  1. Изменить имена свойств в классах до допустимых имен + обновление JSON с новыми именами:

    public class RootObject 
    { 
        public List<ActivitiesHeart> ActivitiesHeart { get; set; } 
        public ActivitiesHeartIntraday ActivitiesHeartIntraday { get; set; } 
    } 
    
  2. Или лучше, изменить имена свойств, а затем, как Джим предложил Используйте JsonPropertyAttribute:

    public class RootObject 
    { 
        [JsonProperty("activities-heart")] 
        public List<ActivitiesHeart> ActivitiesHeart { get; set; } 
        [JsonProperty("activities-heart-intraday")] 
        public ActivitiesHeartIntraday ActivitiesHeartIntraday { get; set; } 
    } 
    

он будет работать

+1

Как насчет '[JsonProperty (« activity-heart »)]' и '[JsonProperty (« activity-heart-intraday »)]'? – Jim

+2

@ Jim - Хорошее предложение. См. Обновление :) –

0

Thnx с JsonProperty он работал сразу.

Belowis путь Icall api и deserialize, только если кто-то еще нуждается в помощи.

var apiCall = ToFullUrl("/1/user/{0}/activities/heart/date/{1}/{2}.json", encodedUserId, ToFitbitFormat(startDate), ToFitbitFormat(endDateOrPeriod)); 
HttpResponseMessage response = await HttpClient.GetAsync(apiCall); 
await HandleResponse(response);string responseBody = await response.Content.ReadAsStringAsync(); 
RootObject entity = JsonConvert.DeserializeObject<RootObject>(responseBody); 
Смежные вопросы