понедельник, 6 мая 2013 г.

Правильно читаем кириллицу в UTF-8 из JSON-ответа. Десериализация JSON

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Web;
using System.Xml;

....

[DataContract]
        public class iiiText
        {
            [DataMember]
            public String value;
            [DataMember]
            public String delay;
            [DataMember]
            public String status;
            [DataMember]
            public String showRate;
        }

        [DataContract]
        public class iiiAnimation
        {
            [DataMember]
            public String type;
            [DataMember]
            public String duration;
            [DataMember]
            public String isFaded;
        }

        [DataContract]
        public class iiiResult
        {
            [DataMember]
            public iiiText text;
            [DataMember]
            public iiiAnimation animation;
            [DataMember]
            public String navigation;
            [DataMember]
            public String token;
            [DataMember]
            public String showExpSys;
            [DataMember]
            public String rubric;
        }

        [DataContract]
        public class iiiClass
        {
            [DataMember]
            public iiiResult result;
            [DataMember]
            public String id;
        }

        public class JSONHelper
        {
            public static T Deserialise(string json)
            {
                using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
                {
                    var serialiser = new DataContractJsonSerializer(typeof(T));
                    return (T)serialiser.ReadObject(ms);
                }
            }

        }


static void Main(string[] args)
        {
            String ChatBotId = "xxxxxx-xxxx-xxx-xxx";

            while (true)
            {
                String message = Console.ReadLine();
                String url =
                    String.Format(
                        "https://...{0}...{1}..."
                        , ChatBotId
                        , HttpUtility.UrlEncode(message));
                HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(url);
                HttpWebResponse response = (HttpWebResponse) request.GetResponse();
                StreamReader responseReader = new StreamReader(response.GetResponseStream(),
                                                               Encoding.GetEncoding("windows-1251"));
                string html = responseReader.ReadToEnd();

                Regex r = new Regex(@".+?\((.+?)\)$");
                Match m = r.Match(html);
                if (m.Success)
                    html = m.Groups[1].Value;

                var answerData = JSONHelper.Deserialise(html);
                Console.WriteLine("{0}", answerData.result.text.value);
            }
        }