我希望将以下数据转换为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”放入对象中,并且遇到了困难。
答案 0 :(得分:0)
您不应该反序列化为RootObject[]
而不是API_Response
吗?另外,根据设置,您可能需要在Pascal大小写中包含C#变量,即CommonName
和ProcessorID
答案 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);