【问题标题】:Insert comma into string where two brackets are touching (C#)在两个括号接触的字符串中插入逗号(C#)
【发布时间】:2017-06-24 01:25:05
【问题描述】:

我正在尝试用 C# 编写一个 JSON 文件,但我遇到了一个问题,我想用逗号 (',') 分隔每个对象以使其成为有效的 JSON,但是我不知道如何去做这个。我已经搜索过是否有一种方法可以在字符串中搜索特定模式(在我的情况下是“}{”),并且正则表达式可能有效,但我不知道如何创建一个。

最终结果应该是这样的

      '},{'

而不是

      '}{'.

到目前为止,这是我的代码:

    private void loopThroughArray()
    {
        string json = "";
            for (int i = 0; i < array.Count; i++)
            {
                MyObject t = array[i];
                json += new JavaScriptSerializer().Serialize(t);
                //this writes the json to the file but without comma seperator
            }

        System.IO.File.WriteAllText(@"<MyFilepath>\json.txt", "{\"json\":[" + json + "]}");
       //this writes the json to a file that and is in a json array called 'json' 

    }

【问题讨论】:

  • 为什么要编写自己的 JSON 序列化程序?如果可以的话,应该使用newtonsoft.com/json 之类的东西。
  • 我会看看 Newtonsoft 的,我知道它对反序列化有好处。我认为 JavaScriptSerializer 和我得到的一样好。

标签: c# json string delimiter


【解决方案1】:

我根据@Measuring 的建议查看了序列化 JSON 的不同方法,发现这是我认为最简单的方法:

    json = JsonConvert.SerializeObject(MyObject);

完美运行,感谢@Measuring!

【讨论】:

【解决方案2】:

我同意@Measuring 的观点,当this answer 中确定有可以使用的工具时,编写自己的工具似乎过于复杂。

尽管如此,您可以执行以下操作...

string json = "";
for (int i = 0; i < array.Count; i++){
    MyObject t = array[i];
    json += new JavaScriptSerializer().Serialize(t);
}

string pattern = "\}{\";
string replacement = "},{";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(json, replacement);

【讨论】:

    【解决方案3】:

    string.Join 和一点 Linq 可以解决你想要做的事情

    var serializer = new JavaScriptSerializer();
    var json = string.Join( ",", array.Select( e => serializer.Serialize(e) );
    

    【讨论】:

      【解决方案4】:

      看起来像这样:

      json += new JavaScriptSerializer().Serialize(t);
      

      正在创建{json object}。您的解决方案可能很简单,就像在如下之后附加 ,

      json += new JavaScriptSerializer().Serialize(t) + ",";
      

      编辑(回复您的评论):
      您可以使用内部检查轻松跳过最后一个循环。

      json += new JavaScriptSerializer().Serialize(t);
      if (i < array.Count - 1) json += ",";
      

      或者,您可以缩短 for 循环 1 项并在循环之后添加最后一项。

      【讨论】:

      • 几乎是。它只是在数组关闭之前在文件末尾添加了一个额外的 , :(
      • string.Join( ",", array.Select( e => serializer.Serialize(e) )
      【解决方案5】:

      使用 StringBuilder 比使用 += 效率高得多,您应该避免在循环中创建可重用的对象。

      尽可能贴近您的代码,您可以尝试:

      private void loopThroughArray()
      {
         var serializer = new JavaScriptSerializer();
         var json = new System.Text.StringBuilder();
         for (int i = 0; i < array.Count; i++)
         {
            MyObject t = array[i];
            json.Append(serializer.Serialize(t));
            if (i < array.Count)
               json.Append(",");
         }
         System.IO.File.WriteAllText(@"<MyFilepath>\json.txt", "{\"json\":[" + json.ToString() + "]}");
      }
      

      但尝试起来可能更简单:

      private void loopThroughArray()
      {
         var serializer = new JavaScriptSerializer();
         var json = serializer.Serialize(array);
         System.IO.File.WriteAllText(@"<MyFilepath>\json.txt", "{\"json\":" + json.ToString() + "}");
      }
      

      但是,如果我这样做,我会在匿名类型上使用 Json.Net 的 JsonConvert:

      System.IO.File.WriteAllText(
          @"<MyFilepath>\json.txt",
          JsonConvert.SerializeObject(new {
              json = array
          }));
      

      你可以从nuget获取Json.Net。

      【讨论】:

      • 请注意,您的最后一个建议适用于 JavaScriptSerializer 就好了...
      • 你说得对,阿列克谢。我只是出于所以很多原因更喜欢 Json.Net。
      【解决方案6】:

      JsonNet 确实更容易使用,但在你的情况下感觉就像 JavaScriptSerializer 工作正常。大概您期望 "{json:[...]}" 作为结果 - 序列化 new {json = array} 而不仅仅是 array 将产生该输出:

      var finalJson = new JavaScriptSerializer().Serialize(new {json = array});
      

      附注:在构造 JSON 或 XML 时,请避免手动操作字符串 - 这不值得付出努力,结果在大多数情况下有些错误。

      【讨论】:

        【解决方案7】:

        嗨,凯文,用正则表达式替换字符串是不可能的,

        /}{/g
        

        并替换为

        },{
        

        【讨论】:

          猜你喜欢
          • 2018-04-14
          • 2012-08-07
          • 2014-05-27
          • 2010-10-17
          • 1970-01-01
          • 2022-11-18
          • 2016-04-12
          • 1970-01-01
          相关资源
          最近更新 更多