сложная схема JSON .. помощь - PullRequest
       4

сложная схема JSON .. помощь

0 голосов
/ 22 сентября 2010

"responseCode": строка

"responseMessage": строка

"responseBody": {"разговор": [

{

"разговорный идентификатор": String,

" state ": String,

" dialogType ": String,

" mediaType ": Enum,

" startDate ":Integer,

"duration": целое число,

"tags": [{"tagName": String,

"tagType": String,

"tagCreateDate": Integer,

"tagOffset": Integer

}],]}

Эта схема продолжается, но мой вопрос относительно первого раздела относится ко всем остальным...

Как я могу десериализовать ответ JSON на основе этой схемы в объекты .NET?как будет выглядеть объект .NET?

Есть ли другой способ прочитать?(как способ набора данных .NET?)

Спасибо.Roey.

Ответы [ 2 ]

1 голос
/ 22 сентября 2010

Если вы хотите (или должны) использовать JavaScriptSerializer , код может выглядеть следующим образом:

using System;
using System.Collections.Generic;
using System.Web.Script.Serialization;

namespace JsonSer {
    public class MyTag {
        public string tagName { get; set; }
        public string tagType { get; set; }
        public long tagCreateDate { get; set; }
        public int tagOffset { get; set; }
    }
    public enum MyMedia {
        Diskette,
        UsbStick,
        Disk,
        Internet
    }
    public class MyConversation {
        public string conversationId { get; set; }
        public string state { get; set; }
        public string conversationType { get; set; }
        public MyMedia mediaType { get; set; }
        public long startDate { get; set; }
        public int duration { get; set; }
        public List<MyTag> tags { get; set; }
    }
    public class MyConversations {
        public List<MyConversation> conversations { get; set; }
    }
    public class MyData {
        public string responseCode { get; set; }
        public string responseMessage { get; set; }
        public MyConversations responseBody { get; set; }
    }
    class Program {
        static void Main (string[] args) {
            MyData data = new MyData () {
                responseCode = "200",
                responseMessage = "OK",
                responseBody = new MyConversations () {
                    conversations = new List<MyConversation> () {
                         new MyConversation() {
                             conversationId = "conversation1",
                             state = "state1",
                             conversationType = "per JSON",
                             mediaType = MyMedia.Internet,
                             startDate = DateTime.Now.Ticks,
                             duration = 12345,
                             tags = new List<MyTag>() {
                                 new MyTag() {
                                     tagName = "tagName1",
                                     tagType = "tagType1",
                                     tagCreateDate = DateTime.Now.Ticks,
                                     tagOffset = 1
                                 }
                             }
                         }
                     }
                }
            };

            Console.WriteLine ("The original data has responseCode={0}", data.responseMessage);
            JavaScriptSerializer serializer = new JavaScriptSerializer ();
            string json = serializer.Serialize (data);
            Console.WriteLine ("Data serialized with respect of JavaScriptSerializer:");
            Console.WriteLine (json);
            MyData d = (MyData)serializer.Deserialize<MyData> (json);
            Console.WriteLine ("After deserialization responseCode={0}", d.responseMessage);
        }
    }
}

соответствующие данные JSON будут выглядеть как

{
    "responseCode": "200",
    "responseMessage": "OK",
    "responseBody": {
        "conversations": [
            {
                "conversationId": "conversation1",
                "state": "state1",
                "conversationType": "per JSON",
                "mediaType": 3,
                "startDate": 634207605160873419,
                "duration": 12345,
                "tags": [
                    {
                        "tagName": "tagName1",
                        "tagType": "tagType1",
                        "tagCreateDate": 634207605160883420,
                        "tagOffset": 1
                    }
                ]
            }
        ]
    }
}

Вы можете легко изменить код, если решите использовать DataContractJsonSerializer .

0 голосов
/ 22 сентября 2010

Сначала вы можете украсить весь свой JSON, используя http://jsbeautifier.org/, чтобы сделать его более читабельным, и тогда единственный известный мне способ - просто пройтись по каждому свойству шаг за шагом и создать для них классы.Вы должны добавить атрибут [DataContract] для классов и атрибут [DataMember] для свойств.

Пример

[DataContract]
public class Response{
    [DataMember]
    public string responseCode {get;set;}
    [DataMember]
    public string responseMessage {get;set;}
    [DataMember]
    public ResponseBody responseBody {get;set;}
}

Автоматическая генерация этих классов

Существуют альтернативы для XMLSerialization (с использованием XSD), но, насколько мне известно, до сих пор не существует аналогичных решений для json.

Чтобы окончательно десериализовать json в объект .NET, вы можетеиспользуйте следующий код:

Response myResponse = new Person();
MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(myResponse.GetType());
myResponse = serializer.ReadObject(ms) as Response;
ms.Close();

Где Response будет типом объекта, который представляет корень вашего json.

Для получения дополнительной информации посетите страницу MSDNКласс DataContractJsonSerializer .

...