将 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# 变量,即 CommonName
和 ProcessorID
只需使用解码器解码消息
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);
我希望将以下数据转换成一个 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# 变量,即 CommonName
和 ProcessorID
只需使用解码器解码消息
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);