How do I deserialize this JSON array (C#)

时间:2015-07-28 16:14:51

标签: c# json json.net json-deserialization

I am struggling with a subject that has a lot of variants, but I can't seem to find one that works for me, and I think it's because of the way that my JSON array is. I'm not an expert in C# or JSON, but I already manage to "almost" get this to work. I need to get hand with the class that the JSON will deserialize to.

When I run the code I dont get an error, just a nulls in the xKisokData var.

The JSON data that I am getting. Their are these two different ones.

"{\"Event\": \"sConnection\",\"data[device]\": \"fb16f550-2ef1-11e5-afe9-ff37129acbf4\",\"data[mode]\": \"customer\",\"data[starttime]\": \"2015-07-22T16:07:42.030Z\",\"data[endtime]\": \"\"}"
"{\"Event\": \"Log\",\"data[id]\": \"2015-07-22T16:07:23.063Z\",\"data[messages][0][source]\": \"server\",\"data[messages][0][message]\": \"Server is listening on port 1553\"}"

The code I have so far:

// Read in our Stream into a string...
StreamReader reader = new StreamReader(JSONdataStream);
string JSONdata = reader.ReadToEnd();

JavaScriptSerializer jss = new JavaScriptSerializer();
wsKisokData[] xKisokData = jss.Deserialize<wsKisokData[]>(JSONdata);

My Class:

namespace JSONWebService
{

    [DataContract]
    [Serializable]
    public class KisokEvent
    {
        public string eventTrigger { get; set; }
    }

    [DataContract]
    [Serializable]
    public class KisokData
    {
        public string data { get; set; }

    }

    [DataContract]
    [Serializable]
    public class wsKisokData
    {
        public KisokEvent KDEvent { get; set; }
        public List<KisokData> KDData { get; set; }

    }

}

I am sure that I don't understand the Deserialize process. Thanks for the help.

EDIT: I put the JSON in the top part right from the debugger, here is the strings.

{
    "Event": "sConnection",
    "data[device]": "fb16f550-2ef1-11e5-afe9-ff37129acbf4",
    "data[mode]": "customer",
    "data[starttime]": "2015-07-22T16:07:42.030Z",
    "data[endtime]": ""
}

{
    "Event": "Log",
    "data[id]": "2015-07-22T16:07:23.063Z",
    "data[messages][0][source]": "server",
    "data[messages][0][message]": "Server is listening on port 1553"
}

1 个答案:

答案 0 :(得分:0)

I would HIGHLY recommend using the json.net package off nuget instead. You can generate template classes (models) for it by pasting the json into http://json2csharp.com/

Then use said models to convert the json into a c# object (deserializing) by doing a

var jsonStructure = JsonConvert.DeserializeObject<model>(json)

And query as if it was just a standard object

foreach (var x in jsonStructure.KDData)
{
    doAction(x.data);
}
// for example