我有一些JSON从API返回,如下所示我需要解析成一些其他可用对象的数组:
{
"Patients": [
{
"ChartNumber": "U1EQ643",
"DateOfBirth": {
"Raw": "19940704",
"Value": null
},
"FirstName": "Joe",
"LastName": "Smith",
"MiddleName": null,
"Sex": "M",
"SocialSecurityNumber": {
"Formatted": "xxx-xx-xxxx",
"Raw": "xxxxxxxxx"
}
},
{
"ChartNumber": "abcQ643",
"DateOfBirth": {
"Raw": "19910614",
"Value": null
},
"FirstName": "Alison",
"LastName": "Smith",
"MiddleName": null,
"Sex": "F",
"SocialSecurityNumber": {
"Formatted": "xxx-xx-xxxx",
"Raw": "xxxxxxxxx"
}
},
}
以下是我目前在代码中的内容:
class Svc1
{
public void TrySearch2()
{
string URL = "https://SOMEWHERE.com/search";
WebRequest request = WebRequest.Create(URL);
request.Method = "POST";
request.ContentType = "application/json; charset=utf-8";
string searchFor = "smith";
string postData = "{\"Authentication\": {\"SubscriberKey\": \"ABC\"," +
"\"SiteServiceKey\": \"DEF\"}," +
"\"" + requestType + "\": \"" + searchFor + "\"}";
//get a reference to the request-stream, and write the postData to it
using (Stream s = request.GetRequestStream())
{
using (StreamWriter sw = new StreamWriter(s))
sw.Write(postData);
}
//get response-stream, and use a streamReader to read the content
using (Stream s = request.GetResponse().GetResponseStream())
{
using (StreamReader sr = new StreamReader(s))
{
var jsonData = sr.ReadToEnd();
var ds = new DataContractJsonSerializer(typeof(Patient[]));
var msnew = new MemoryStream(Encoding.UTF8.GetBytes(jsonData));
Patient[] items = (Patient[])ds.ReadObject(msnew);
}
}
}
//patient class
[Serializable]
public class Patient
{
private string _chartNumber;
private string _dateOfBirth;
private string _firstName;
private string _lastName;
private string _middleName;
private string _sex;
private string _ssNum;
public Patient(string chartNo, string DOB, string first, string last, string middle, string sex, string SSNum)
{
this._chartNumber = chartNo;
this._dateOfBirth = DOB;
this._firstName = first;
this._lastName = last;
this._middleName = middle;
this._sex = sex;
this._ssNum = SSNum;
}
public string chartNumber
{
get { return _chartNumber; }
set { _chartNumber = value; }
}
public string dateOfBirth
{
get { return _dateOfBirth; }
set { _dateOfBirth = value; }
}
public string firstName
{
get { return _firstName; }
set { _firstName = value; }
}
public string lastName
{
get { return _lastName; }
set { _lastName = value; }
}
public string middleName
{
get { return _middleName; }
set { _middleName = value; }
}
public string sex
{
get { return _sex; }
set { _sex = value; }
}
public string SSNumber
{
get { return _ssNum; }
set { _ssNum = value; }
}
}
答案 0 :(得分:1)
从你提供的Json,我认为你需要一个包含属性患者的类
public class ListOfPatients
{
public ListOfPatinets(){Patients = new List<Patinent>();}
public List<Patient> Patients{get;set;}
}
然后从你的新类的Json反序列化对象
var ds = new DataContractJsonSerializer(typeof(ListOfPatients));
var msnew = new MemoryStream(Encoding.UTF8.GetBytes(jsonData));
ListOfPatients list = (ListOfPatients)ds.ReadObject(msnew);
var patients = list.Patients;
.....
我相信你需要在Patient类中使用默认构造函数,并且在将Json与对象属性匹配时不确定DataContractSerializer是否区分大小写。在Json你有“ChartNumber”,在Patient类你有“chartNumber”,这可能会导致问题,但我不确定。
答案 1 :(得分:1)
请将DataMember属性放在Parent类的每个属性上。
还有一件事,你定义的类结构不是你提到的json。
dateofBirth和SocialSecurityNumbers也是对象,您将其视为Parent类中的字符串。