Reputation: 3392
I have some JSON coming back from an API as follows that I need to parse into an array of some other workable object:
{
"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"
}
},
}
Here's what I have so far in my code:
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; }
}
}
Upvotes: 0
Views: 1658
Reputation: 1531
Please put DataMember attribute on every property of your Parent class.
One more thing, the class structure you defined is not as per json you mentioned.
dateofBirth and SocialSecurityNumbers are also object and you are treating it as a string in the Parent class.
Upvotes: 1
Reputation: 6445
From the Json you provided, I think you need a class that contains property Patients
public class ListOfPatients
{
public ListOfPatinets(){Patients = new List<Patinent>();}
public List<Patient> Patients{get;set;}
}
and then from your Json deserialize object of that new class
var ds = new DataContractJsonSerializer(typeof(ListOfPatients));
var msnew = new MemoryStream(Encoding.UTF8.GetBytes(jsonData));
ListOfPatients list = (ListOfPatients)ds.ReadObject(msnew);
var patients = list.Patients;
.....
And I believe you need a default constructor in Patient class, and not sure if DataContractSerializer is case sensitive when matching Json to object properties. In Json you have "ChartNumber" and in the Patient class you have "chartNumber", that could cause problems but im not sure.
Upvotes: 1