2016-10-04 2 views
0

Я пытаюсь десериализации JSON, используя следующий C++/CLIклассы C++/CLI и IList

[ 
    { 
     "id":"046e075ad92684", 
     "NfcA":{ 
      "maxTransceiveLength":253, 
      "sak":0, 
      "atqa":"4400", 
      "timeout":618 
     }, 
     "Ndef":[ 
      { 
       "records":[ 
        { 
         "id":"", 
         "tnf":1, 
         "type":"54", 
         "payload":"02656e48656c6c6f206d792041737365742049442069733a20303030303031" 
        } 
       ] 
      } 
     ], 
     "tech":[ 
      "android.nfc.tech.NfcA", 
      "android.nfc.tech.MifareUltralight", 
      "android.nfc.tech.Ndef" 
     ], 
     "time":1472468356002 
    } 
] 

Я уже объявили следующие классы для того, чтобы получить содержимое данных JSON.

ref class tech { 
    public: String^ tech1; 
    public: String^ tech2; 
    public: String^ tech3; 
}; 

ref class Record { 
    public: String^ id; 
    public: int tnf; 
    public: String^ type; 
    public: String^ payload; 
}; 

ref class Topic_nfc { 
    public: String^ id; 
    public: ref class NfcA { 
    public: int maxTransceiveLength; 
    public: int sak; 
    public: int atqa; 
    public: int timeout; 
    }; 
    public: ref class Ndef { 
    public: System::Collections::Generic::IList<Record^>^ records; 
    }; 
    public: System::Collections::Generic::IList<Ndef^>^ Ndef; 
    public: System::Collections::Generic::IList<String^>^ tech; 
    public: unsigned long long time; 

    public: 
    NfcA^ NfcA; 
}; 

После десериализации я могу получить доступ к идентификатору и maxTransceiveLength обычно используя

printf("MyRawdata[i]->id : %s\n", MyRawdata[i]->id); 
printf("MyRawdata[i]->NfcA->maxTransceiveLength : %d\n", MyRawdata[i]->NfcA->maxTransceiveLength); 

где MyRawdata производный от

System::Collections::Generic::IList<Topic_nfc^>^ MyRawdata = JsonConvert::DeserializeObject<System::Collections::Generic::IList<Topic_nfc^>^>(MyJson); 

Однако, я не могу понять, как мы можем получить доступ Ndef и tech данные таких как payload. Можете ли вы указать, что является эквивалентом для IList?

Спасибо

+0

Используйте 'List' вместо' IList', Json.NET не знает, какой конкретный класс он должен использовать для десериализации интерфейса. –

+0

Даже используя List вместо IList, мне не ясно, какой код для доступа к этим данным. Который был бы равнозначен 'printf (« MyRawdata [i] -> id:% s \ n ", MyRawdata [i] -> id);' для получения данных tech1? Это немного сбивает меня с толку. – Fotakis

+0

Я не думаю, что проблема - это 'IList'. Установив точки останова в Visual Studio, я могу оценить значения 'tech1' через пользовательский интерфейс VS и правильные значения, поэтому они хорошо установлены с помощью' JsonConvert'. Вопрос в том, как я могу ссылаться на структуру MyRawdata для доступа к этим данным с кодом? – Fotakis

ответ

0

Благодаря @Lucas Trzesniewski помощь, я пришел к выводу, что эти списки можно получить с помощью следующего кода.

for (int k = 0 ; k < MyRawdata[i]->Ndef->Count ; k++) { 
    printf("MyRawdata[i]->Ndef[k]->records[k]->payload : %s\n", MyRawdata[i]->Ndef[k]->records[k]->payload); 
} 

for (int k = 0 ; k < MyRawdata[i]->tech->Count ; k++) { 
    printf("MyRawdata[i]->tech[k] : %s\n", MyRawdata[i]->tech[k]); 
} 

Фактически, это был вопрос синтаксиса для доступа к данным в соответствующих классах.

Смежные вопросы