需要使用asp.net将JSON记录解析为数组

时间:2013-04-23 17:57:50

标签: c# json

我有一些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; }
    }
}

2 个答案:

答案 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类中的字符串。