Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将列表序列化为JSON_C#_Asp.net_Json - Fatal编程技术网

C# 将列表序列化为JSON

C# 将列表序列化为JSON,c#,asp.net,json,C#,Asp.net,Json,我有一个如下所示的对象模型: public MyObjectInJson { public long ObjectID {get;set;} public string ObjectInJson {get;set;} } StringBuilder TheListBuilder = new StringBuilder(); TheListBuilder.Append("["); int TheCounter = 0; foreach (MyObjectInJ

我有一个如下所示的对象模型:

public MyObjectInJson
{
   public long ObjectID {get;set;}
   public string ObjectInJson {get;set;}
}
StringBuilder TheListBuilder = new StringBuilder();

TheListBuilder.Append("[");
int TheCounter = 0;

foreach (MyObjectInJson TheObject in TheList)
{
  TheCounter++;
  TheListBuilder.Append(TheObject.ObjectInJson);

  if (TheCounter != TheList.Count())
  {
    TheListBuilder.Append(",");
  }
}
TheListBuilder.Append("]");

return TheListBuilder.ToString();
属性
ObjectInJson
是包含嵌套列表的对象的已序列化版本。目前,我正在手动序列化
MyObjectInJson
的列表,如下所示:

public MyObjectInJson
{
   public long ObjectID {get;set;}
   public string ObjectInJson {get;set;}
}
StringBuilder TheListBuilder = new StringBuilder();

TheListBuilder.Append("[");
int TheCounter = 0;

foreach (MyObjectInJson TheObject in TheList)
{
  TheCounter++;
  TheListBuilder.Append(TheObject.ObjectInJson);

  if (TheCounter != TheList.Count())
  {
    TheListBuilder.Append(",");
  }
}
TheListBuilder.Append("]");

return TheListBuilder.ToString();
我想知道是否可以用
JavascriptSerializer
替换这种危险的代码,并得到同样的结果。 如果使用.Net Core 3.0或更高版本,我将如何执行此操作?

; 默认使用内置的
System.Text.Json
解析器实现

e、 g

或者,也可以使用其他不太主流的选项,比如parser和:如果您确实需要,这些选项可能会提供,但是您需要安装它们各自的软件包

如果使用.Net Core 2.2或更早版本卡住; 默认使用Newtonsoft JSON.Net作为首选JSON解析器

e、 g

您可能需要先安装软件包

PM> Install-Package Newtonsoft.Json
更多细节

仅供参考,这是多年前的原始答案;
使用内置JSON序列化程序有两种常见的方法:

  • 请注意,此选项需要为类定义数据约定:

    [DataContract]
    public class MyObjectInJson
    {
       [DataMember]
       public long ObjectID {get;set;}
       [DataMember]
       public string ObjectInJson {get;set;}
    }
    

  • 自3.5版以来,.NET已经通过和类支持基本Json序列化。顾名思义,DataContractJsonSerializer会考虑添加到对象中的任何数据注释,以创建最终的Json输出

    如果您已经有了要将Json序列化为流的带注释的数据类,那么这将非常方便,如中所述。虽然有一些限制,但如果您有基本的需求,并且不想再向项目中添加另一个库,那么它就足够好、足够快了

    以下代码将列表序列化到控制台输出流。正如您所看到的,它比Json.NET要详细一点,并且不是类型安全的(即没有泛型)

    var list=新列表{“a”、“b”、“c”、“d”};
    使用(var output=Console.OpenStandardOutput())
    {                
    var writer=newdatacontractjsonserializer(typeof(List));
    WriteObject(输出,列表);
    }
    
    另一方面,它可以更好地控制如何生成Json。当您必须将javascript友好名称映射到.NET类、将日期格式化为json等时,这将非常方便


    另一个选择是,部分。。。堆栈,它为Json、JSV和CSV提供了一组非常快速的序列化程序。

    您也可以使用Json.NET。只需在下载它,提取压缩文件并添加它作为参考

    然后用以下命令序列化列表(或任何您想要的对象):

    using Newtonsoft.Json;
    
    string json = JsonConvert.SerializeObject(listTop10);
    
    更新:您还可以通过NuGet软件包管理器(工具-->NuGet软件包管理器-->软件包管理器控制台)将其添加到项目中:

    文档:公共静态字符串JSONSerialize(T obj) { string retVal=string.Empty; 使用(MemoryStream ms=new MemoryStream()) { DataContractJsonSerializer=新的DataContractJsonSerializer(obj.GetType()); serializer.WriteObject(ms,obj); var byteArray=ms.ToArray(); retVal=Encoding.UTF8.GetString(byteArray,0,byteArray.Length); } 返回返回; }
    以另一篇帖子的答案为基础。。我提出了一种更通用的方法来构建列表,利用Json.NET 12.x版的动态检索

    using Newtonsoft.Json;
    
    static class JsonObj
    {
        /// <summary>
        /// Deserializes a json file into an object list
        /// Author: Joseph Poirier 2/26/2019
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static List<T> DeSerializeObject<T>(string fileName)
        {
            List<T> objectOut = new List<T>();
    
            if (string.IsNullOrEmpty(fileName)) { return objectOut; }
    
            try
            {
                // reading in full file as text
                string ss = File.ReadAllText(fileName);
    
                // went with <dynamic> over <T> or <List<T>> to avoid error..
                //  unexpected character at line 1 column 2
                var output = JsonConvert.DeserializeObject<dynamic>(ss);
    
                foreach (var Record in output)
                {
                    foreach (T data in Record)
                    {
                        objectOut.Add(data);
                    }
                }
            }
            catch (Exception ex)
            {
                //Log exception here
                Console.Write(ex.Message);
            }
    
            return objectOut;
        }
    }
    
    使用Newtonsoft.Json;
    静态类JsonObj
    {
    /// 
    ///将json文件反序列化为对象列表
    ///作者:Joseph Poirier 2019年2月26日
    /// 
    /// 
    /// 
    /// 
    公共静态列表反序列化对象(字符串文件名)
    {
    List objectOut=new List();
    if(string.IsNullOrEmpty(fileName)){return objectOut;}
    尝试
    {
    //以全文形式阅读
    字符串ss=File.ReadAllText(文件名);
    //为避免错误而进行的。。
    //第1行第2列出现意外字符
    var output=JsonConvert.DeserializeObject(ss);
    foreach(输出中的var记录)
    {
    foreach(记录中的T数据)
    {
    objectOut.Add(数据);
    }
    }
    }
    捕获(例外情况除外)
    {
    //此处记录异常
    控制台。写入(例如消息);
    }
    退出;
    }
    }
    
    呼叫处理

    {
            string fname = "../../Names.json"; // <- your json file path
    
            // for alternate types replace string with custom class below
            List<string> jsonFile = JsonObj.DeSerializeObject<string>(fname);
    }
    
    {
            string fname = "../../Names.json"; // <- your json file path
    
            // for alternate types replace string with custom class below
            List<string> jsonFile = new List<string>();
            jsonFile.AddRange(JsonObj.DeSerializeObject<string>(fname));
    }
    
    {
    
    string fname=“../../Names.json”;//如果您在asp.Net核心API操作的上下文中执行此操作,则会隐式地转换为json

    [HttpGet]
    public ActionResult Get()
    {
        return Ok(TheList);
    }
    

    啊,好的,它还序列化对象列表,而不仅仅是对象本身。谢谢。我不喜欢循环关系,但这不是一个问题。请注意,这个名称空间巧妙地隐藏在System.Web.Extensions中。一旦您添加它作为参考,该解决方案将非常有效!我看到了您编辑过的答案,真希望我有一个更新的名称空间示例。@IamNumber5已在另一个答案中提供。我还是扩展了我的答案。请注意,在WPF项目中,您需要添加对
    System.Web.Extensions
    的引用才能使用
    System.Web.Script.Serialization
    PM> Install-Package Newtonsoft.Json
    
    public static string JSONSerialize<T>(T obj)
            {
                string retVal = String.Empty;
                using (MemoryStream ms = new MemoryStream())
                {
                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                    serializer.WriteObject(ms, obj);
                    var byteArray = ms.ToArray();
                    retVal = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);
                }
                return retVal;
            }
    
    using Newtonsoft.Json;
    
    static class JsonObj
    {
        /// <summary>
        /// Deserializes a json file into an object list
        /// Author: Joseph Poirier 2/26/2019
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static List<T> DeSerializeObject<T>(string fileName)
        {
            List<T> objectOut = new List<T>();
    
            if (string.IsNullOrEmpty(fileName)) { return objectOut; }
    
            try
            {
                // reading in full file as text
                string ss = File.ReadAllText(fileName);
    
                // went with <dynamic> over <T> or <List<T>> to avoid error..
                //  unexpected character at line 1 column 2
                var output = JsonConvert.DeserializeObject<dynamic>(ss);
    
                foreach (var Record in output)
                {
                    foreach (T data in Record)
                    {
                        objectOut.Add(data);
                    }
                }
            }
            catch (Exception ex)
            {
                //Log exception here
                Console.Write(ex.Message);
            }
    
            return objectOut;
        }
    }
    
    {
            string fname = "../../Names.json"; // <- your json file path
    
            // for alternate types replace string with custom class below
            List<string> jsonFile = JsonObj.DeSerializeObject<string>(fname);
    }
    
    {
            string fname = "../../Names.json"; // <- your json file path
    
            // for alternate types replace string with custom class below
            List<string> jsonFile = new List<string>();
            jsonFile.AddRange(JsonObj.DeSerializeObject<string>(fname));
    }
    
    [HttpGet]
    public ActionResult Get()
    {
        return Ok(TheList);
    }