Преобразование строки JSON в объект / массив C # - PullRequest
0 голосов
/ 19 ноября 2018

Я хочу преобразовать следующие данные в ac # объект или массив, в котором я могу отобразить каждый элемент (в конечном итоге будет отображаться в виде списка).

сам json выглядит так:

[
    {
        "commonName": "uni_comp_4",
        "processorID": "BFEFBDEB001201"
    },
    {
        "commonName": "lib_comp_12",
        "processorID": "BFEFBDEB004323"
    }
]

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

Я использую класс:

public class API_Response
{
    public bool IsError { get; set; }
    public string ErrorMessage { get; set;
    public dynamic ResponseData { get; set; }
}

для переноса данных.Мои «данные» JSON такие же, как показано выше, однако у меня возникли проблемы с десериализацией этого.

Первоначально я попытался:

API_Response r = JsonConvert.DeserializeObject<API_Response>(response);

, и я могу увидеть строку JSON с MessageBox.show (r.ResponseData).Который по своей сути не десериализован.

Кроме того, я попытался объявить следующее в том же методе:

public class RootObject
{
    public string commonName { get; set; }
    public string processorID { get; set; }
}

без удачи в отображении этих данных индивидуально (или вообще).

По сути, я пытаюсь поместить "ResponseData" класса API_Response в объект, и у меня возникают трудности.

Ответы [ 4 ]

0 голосов
/ 20 ноября 2018
public class RootObject{
   public string commonName { get; set; }
   public string processorID { get; set; }
}

public class API_Response
{
    public bool IsError { get; set; }
    public string ErrorMessage { get; set; }
    public RootObject[] ResponseData { get; set; }
}


API_Response r = JsonConvert.DeserializeObject<API_Response>(response);

Затем я могу использовать этот формат для вызова данных

MessageBox.Show("" + r.ResponseData[0].commonName);
0 голосов
/ 19 ноября 2018

просто используйте декодер для декодирования сообщения

Struct PCS: Decodable
{
 let commonName : String?
 let proccesorID : String?

}

var pcs = [PCS]()

поместите это в viewdidload

func parseData(){

        let jsonUrlString = "Your_API_URL"
        guard let url = URL(string: jsonUrlString) else { return }

        URLSession.shared.dataTask(with: url) {(data, response, err) in

            guard let data = data else { return }

            do {

                let decoder = JSONDecoder()
                pcs = try decoder.decode([Course].self, from: data)

                DispatchQueue.main.async {

                    self.tableView.reloadData()

                }


            } catch let jsonErr{
                print("error", jsonErr)
            }


            }.resume()

в tableView вызовите данные, подобные этим

pcs[indexPath.row].commonName
0 голосов
/ 19 ноября 2018

Вы пытаетесь десериализовать объект с помощью класса, в котором нет элементов, упомянутых в JSON. Попробуйте поставить List<RootObject>, потому что ваш JSON содержит список класса RootObject, который вы создали. Попробуйте приведенное ниже решение, если оно работает для вас.

JsonConvert.DeserializeObject<List<RootObject>>(response);
0 голосов
/ 19 ноября 2018

Разве вы не должны десериализовать в RootObject[], а не API_Response?Кроме того, в зависимости от настроек вам может потребоваться переменные C # в корпусе Pascal, то есть CommonName и ProcessorID

...