วันพฤหัสบดีที่ 30 พฤษภาคม พ.ศ. 2562

ข้อระวังความไม่ compatible ระหว่าง Microsoft Json และ NewtonSoft Json

JSON ใช้เป็นหลักในการเชื่อมระหว่างโปรแกรมกับ Cloud โดยผ่าน file หรือ Http

Json มี 2 ค่าย หลัก ได้แก่ Newtonsoft กับ Microsoft
ในการใช้งาน จะมี Class Generator สำหรับ Json ที่
Quicktype.Io จะสร้าง Class สำหรับ Newtonsoft แต่จะไม่ compatible กับ Microsoft
ตัวที่ต้องระวัง คือ DateTime
ให้เปลี่ยนใน
Class เป็น String เช่น

 public partial class CustomVisionJson
    {
        //[JsonProperty("id")]
        public Guid id { get; set; }

        //[JsonProperty("project")]
        public Guid project { get; set; }

        //[JsonProperty("iteration")]
        public Guid iteration { get; set; }

        //[JsonProperty("created")] // previous type is DateTimeOffset
        public string created { get; set; }

      //  [JsonProperty("predictions")]
        public Prediction [] predictions { get; set; }
    }


การ Serialize และ DeSerialize ของ Microsoft

     public static CaptureInfo FromJson(string json)
        {
            return doDeserialize(json, typeof(CaptureInfo)) as CaptureInfo;
        }
        public static string ConvertToJSON(object obj)
        {
            string s = doSerialize(obj);
            return s;
        }
        public static string doSerialize(object obj)
        {
            using (MemoryStream memoryStream = new MemoryStream())
            using (StreamReader reader = new StreamReader(memoryStream))
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                serializer.WriteObject(memoryStream, obj);
                memoryStream.Position = 0;
                return reader.ReadToEnd();
            }
        }

        public static object doDeserialize(string xml, Type toType)
        {
            using (Stream stream = new MemoryStream())
            {
                byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);
                stream.Write(data, 0, data.Length);
                stream.Position = 0;
                DataContractJsonSerializer deserializer = new DataContractJsonSerializer(toType);
                return deserializer.ReadObject(stream);
            }
        }

   

ของ Newtonsoft

  public partial class CustomVisionJson
    {
        public static CustomVisionJson FromJson(string json) => JsonConvert.DeserializeObject<CustomVisionJson>(json, QuickType.Converter.Settings);
    }

    public static class Serialize
    {
        public static string ToJson(this CustomVisionJson self) => JsonConvert.SerializeObject(self, QuickType.Converter.Settings);
    }


Newtonsoft จะง่าย กว่า แต่ข้อเสียคือจะ run ใน CS Script ไม่ได้