最新のC#Objectとjsonの相互転送

4326 ワード

ネット上でC#Objectとjsonを検索して互いに回転して、主に2つの方案があって、しかしすべて使うことができないことを発見します.
まず、デバッグが正常に使用できるものを提供します.net framework 4.0、対応するdllライブラリを追加:Newtonsoft.Json.dll
using Core.Bases;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;


namespace Core.Text
{
    public class JsonTools
    {

        //          Json 
        public static string ObjectToJson(object obj)
        {
            return Newtonsoft.Json.JsonConvert.SerializeObject(obj);
        }
        //    Json       
        public static object JsonToObject(string jsonString, object obj)
        {
            return Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString, obj.GetType());
        }
    }
}

ネット上の主な方案1:
public static APIResponse GetResponse(string str)
        {

            StringReader sr = new StringReader(str);
            JsonSerializer serializer = new JsonSerializer();
            return (APIResponse)serializer.Deserialize(new JsonTextReader(sr), typeof(APIResponse));
        }

        /// 
        ///   Json  
        /// 
        /// 
        /// 
        /// 
        public static string GetJson(object obj)
        {
            if (obj == null)
                return "";

            DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());
            using (MemoryStream stream = new MemoryStream())
            {
                json.WriteObject(stream, obj);
                string szJson = Encoding.UTF8.GetString(stream.ToArray());
                return szJson;
            }
        }
        /// 
        ///   Json Model
        /// 
        /// 
        /// 
        /// 
        public static T ParseFromJson(string szJson)
        {
            if (typeof(T) == typeof(IEnumerable<>))
            {

            }
            T obj = Activator.CreateInstance();
            using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                return (T)serializer.ReadObject(ms);
            }
        }

        /// 
        ///   Json Model
        /// 
        /// 
        /// 
        /// 
        public static IEnumerable ParseListFromJson(string szJson)
        {
            JavaScriptSerializer jss = new JavaScriptSerializer();
            return jss.Deserialize>(szJson);

            //T obj = Activator.CreateInstance();
            //using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
            //{
            //    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
            //    return (T)serializer.ReadObject(ms);
            //}
        }

このシナリオでは、次の文字列が実行されます.
"{\"k__BackingField\":0,\"k__BackingField\":0,\"k__BackingField\":0,\"k__BackingField\":4,\"k__BackingField\":15.6384974,\"k__BackingField\":0,\"k__BackingField\":0,\"k__BackingField\":11.9906368,\"k__BackingField\":29.7924538,\"k__BackingField\":0,\"k__BackingField\":874,\"k__BackingField\":8092,\"k__BackingField\":0.268140942,\"k__BackingField\":0.471894622}"
要求に合わない
シナリオ2:
 //          Json 
        public static string ObjectToJson(object obj)
        {
           return JavaScriptConvert.SerializeObject(obj);
        }
        //    Json       
        public static object JsonToObject(string jsonString, object obj)
        {
           return JavaScriptConvert.DeserializeObject(jsonString, obj.GetType());
        }

すでに導入されていますが
Newtonsoft.Json.dll、しかしnet 4.0ではメソッドが期限切れになっているので、見つからないエラーが報告されます.ソリューションは、一番上にあります.