将 JSON 字符串转换为 C# object/array

Converting JSON string to C# object/array

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

json 本身看起来像这样:

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

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

我正在使用 class:

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

用于数据承载。我的 JSON "data" 如上所示,但是我在反序列化时遇到了问题。

最初,我试过:

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

无法单独(或根本)显示此数据。

本质上,我试图将 class API_Response 的 "ResponseData" 放入一个对象中,但我遇到了困难。

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

只需使用解码器解码消息

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

在表格视图中 像这样调用数据

pcs[indexPath.row].commonName

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

JsonConvert.DeserializeObject<List<RootObject>>(response);
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);