0

I am trying to generate C# class using the JSON string from here http://json2csharp.com/ this works fine. But I can't parse the JSON to the object generated by the website.

Here is the JSON string

{
  "searchParameters":{
    "key":"**********",
    "system":"urn:oid:.8"
  },
  "message":" found one Person matching your search criteria.",
  "_links":{
    "self":{
      "href":"https://integration.rest.api.test.com/v1/person?key=123456&system=12.4.34.."
    }
  },
  "_embedded":{
    "person":[
      {
        "details":{
          "address":[
            {
              "line":["5554519 testdr"],
              "city":"testland",
              "state":"TT",
              "zip":"12345",
              "period":{
                "start":"2003-10-22T00:00:00Z",
                "end":"9999-12-31T23:59:59Z"
              }
            }
          ],
          "name":[
            {
              "use":"usual",
              "family":["BC"],
              "given":["TWO"],
              "period":{
                "start":"9999-10-22T00:00:00Z",
                "end":"9999-12-31T23:59:59Z"
              }
            }
          ],
          "gender":{
            "code":"M",
            "display":"Male"
          },
          "birthDate":"9999-02-03T00:00:00Z",
          "identifier":[
            {
              "use":"unspecified",
              "system":"urn:oid:2.19.8",
              "key":"",
              "period":{
                "start":"9999-10-22T00:00:00Z",
                "end":"9999-12-31T23:59:59Z"
              }
            }
          ],
          "telecom":[
            {
              "system":"email",
              "value":"[email protected]",
              "use":"unspecified",
              "period":{
                "start":"9999-10-22T00:00:00Z",
                "end":"9999-12-31T23:59:59Z"
              }
            }
          ],
          "photo":[
            {
              "content":{
                "contentType":"image/jpeg",
                "language":"",
                "data":"",
                "size":0,
                "hash":"",
                "title":"My Picture"
              }
            }
          ]
        },
        "enrolled":true,
        "enrollmentSummary":{
          "dateEnrolled":"9999-02-07T21:39:11.174Z",
          "enroller":"test Support"
        },
        "_links":{
          "self":{
            "href":"https://integration.rest.api.test.com/v1/person/-182d-4296-90cc"
          },
          "unenroll":{
            "href":"https://integration.rest.api.test.com/v1/person/1b018dc4-182d-4296-90cc-/unenroll"
          },
          "personLink":{
            "href":"https://integration.rest.api.test.com/v1/person/-182d-4296-90cc-953c/personLink"
          },
          "personMatch":{
            "href":"https://integration.rest.api.commonwellalliance.org/v1/person/-182d-4296-90cc-/personMatch?orgId="
          }
        }
      }
    ]
  }
}

Here is the code I use to convert to the object.

JavaScriptSerializer js = new JavaScriptSerializer();
 var xx = (PersonsearchVM)js.Deserialize(jsonstr, typeof(PersonsearchVM));

Is there any other wat to generate the object and parse?

2
  • 1
    Are the line-breaks in the actual JSON data or just for readability in this post? If the former, line-breaks are fine between values but aren't valid within a string value. They need to be escaped in those cases -- "\r\n". Commented Feb 20, 2014 at 21:25
  • There are no line breaks in the actual JSON data. Commented Feb 20, 2014 at 21:37

3 Answers 3

1

I think you have some invalid characters in your JSON string. Run it through a validator and add the necessary escape characters.

http://jsonlint.com/

Sign up to request clarification or add additional context in comments.

2 Comments

I copied into notepad and removed all endlines, then copied into the validator and it's valid.
The JSON is valid. I think when OP posted in the JSON, the Html Editor added all the endlines.
0

You aren't casting it to the right object. Cast it to the type RootObject.

Eg

JavaScriptSerializer js = new JavaScriptSerializer();
var xx = (RootObject)js.Deserialize(jsonstr, typeof(RootObject));

The code that json 2 csharp creates is this:

public class SearchParameters
{
    public string key { get; set; }
    public string system { get; set; }
}

    public class Self
{
    public string href { get; set; }
}

public class LinKs
{
    public Self self { get; set; }
}

public class Period
{
    public string start { get; set; }
    public string end { get; set; }
}

public class Address
{
    public List<string> line { get; set; }
    public string city { get; set; }
    public string __invalid_name__state { get; set; }
    public string zip { get; set; }
    public Period period { get; set; }
}

public class PerioD2
{
    public string start { get; set; }
    public string end { get; set; }
}

public class Name
{
    public string use { get; set; }
    public List<string> family { get; set; }
    public List<string> given { get; set; }
    public PerioD2 __invalid_name__perio
d { get; set; }
}

public class Gender
{
    public string __invalid_name__co
de { get; set; }
    public string display { get; set; }
}

public class Period3
{
    public string start { get; set; }
    public string __invalid_name__end { get; set; }
}

public class Identifier
{
    public string use
 { get; set; }
    public string system { get; set; }
    public string key { get; set; }
    public Period3 period { get; set; }
}

public class Period4
{
    public string start { get; set; }
    public string end { get; set; }
}

public class Telecom
{
    public string system { get; set; }
    public string value { get; set; }
    public string use { get; set; }
    public Period4 period { get; set; }
}

public class Content
{
    public string contentType { get; set; }
    public string language { get; set; }
    public string __invalid_name__dat
a { get; set; }
    public int size { get; set; }
    public string hash { get; set; }
    public string title { get; set; }
}

public class Photo
{
    public Content content { get; set; }
}

public class Details
{
    public List<Address> address { get; set; }
    public List<Name> name { get; set; }
    public Gender gender { get; set; }
    public string birthDate { get; set; }
    public List<Identifier> identifier { get; set; }
    public List<Telecom> telecom { get; set; }
    public List<Photo> photo { get; set; }
}

public class EnrollmentSummary
{
    public string dateEnrolled { get; set; }
    public string __invalid_name__en
roller { get; set; }
}

public class Self2
{
    public string href { get; set; }
}

public class UnEnroll
{
    public string href { get; set; }
}

public class PersonLink
{
    public string href { get; set; }
}

public class PersonMatch
{
    public string href { get; set; }
}

public class Links2
{
    public Self2 self { get; set; }
    public UnEnroll __invalid_name__un
enroll { get; set; }
    public PersonLink personLink { get; set; }
    public PersonMatch personMatch { get; set; }
}

public class Person
{
    public Details details { get; set; }
    public bool __invalid_name__e
nrolled { get; set; }
    public EnrollmentSummary enrollmentSummary { get; set; }
    public Links2 _links { get; set; }
}

public class Embedded
{
    public List<Person> person { get; set; }
}

public class RootObject
{
    public SearchParameters searchParameters { get; set; }
    public string message { get; set; }
    public LinKs __invalid_name___lin
ks { get; set; }
    public Embedded _embedded { get; set; }
}

4 Comments

Just a copy/paste from json2csharp. But there are many redundant classes like Telecom(same as *Identifier*), SelfN, LinkN, PeriodN and property names like __invalid_name___.... Very bad answer.
Not a bad answer. The question was why the parse wasn't working. The parse wasn't working because he was casting to the wrong class. It's the right answer.
Perhaps, but it's what the OP was working with. The question wasn't about the quality of the target class definition, it was how to get the deserialization working correctly.
@L.B I did remove the redundant properties. The answer is what I expected
0

The following function will convert JSON into a C# class where T is the class type.

public static T Deserialise<T>(string json)
{
    T obj = Activator.CreateInstance<T>();
    using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                obj = (T)serializer.ReadObject(ms); // 
                return obj;
    }
}

You need a reference to the System.Runtime.Serialization.json namespace.

The function is called in the following manner;

calendarList = Deserialise<GoogleCalendarList>(calendarListString);

calendarlist being the C# class and calendarListString the string containing the JSON.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.