将JSON字符串转换为C#对象/数组

时间:2018-11-19 01:40:14

标签: c# json json-deserialization

我希望将以下数据转换为c#对象或数组,在其中可以显示每个项目(最终将在列表视图中显示)。

json本身看起来像这样:

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

我看过here for help,但是由于系统略有不同,我认为我可能不得不采取另一种方法。

我正在使用课程:

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);

,我可以使用MessageBox.show(r.ResponseData)看到JSON字符串。本质上不会反序列化。

此外,我尝试用相同的方法声明以下内容:

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

运气不好,不能单独(或根本不)显示此数据。

本质上,我试图将API_Response类的“ ResponseData”放入对象中,并且遇到了困难。

4 个答案:

答案 0 :(得分:0)

您不应该反序列化为RootObject[]而不是API_Response吗?另外,根据设置,您可能需要在Pascal大小写中包含C#变量,即CommonNameProcessorID

答案 1 :(得分:0)

您正在尝试使用不包含JSON中提到的元素的类对对象进行反序列化。尝试放入List<RootObject>,因为您的JSON包含您创建的RootObject类的列表。如果适合您,请尝试以下解决方案。

JsonConvert.DeserializeObject<List<RootObject>>(response);

答案 2 :(得分:-1)

只使用解码器对消息进行解码

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

答案 3 :(得分:-1)

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);