zoukankan      html  css  js  c++  java
  • 用 Json.NET 构造 json 格式的文件内容

    对于 json 有关问题,Json.NET的确精于此道。现有如下需求:构造一个 json 格式的文件内容。内容样式如下:

    /* 文件内容样式 */
    {
      "env"   : "env1",
      "query" : "db.collection('col1').add({data: [{field1: 'value1', field2: 'value2'}]})"
    }

    这个 json 格式的难点在于:其中的 query 项目的值是一个字串,这个字串中包含变量(数据库字段名和及其数值)。
    怎样通过 Json.NET 写出来呢?可以分两步,先写出包含变量的变动部分,再写出其他固定内容,并嵌入先前写出的结果。

    1、写出 data 字串。先定义一个类(表示数据库结构),再赋值,再写出来(JsonTextWriter)。

    /* 数据库结构的类  */
    public class col1_fields
    {
        public string field1 [get;set];
        public string field2 [get;set];
    }

    /* 生成字串  */
    public class myclass1
    {
        public static string myproc1()
        {  
               col1_fields cf1 = new col1_fields;
               cf1.field1 = "value1";
               cf1.field2 = "value2";

               JsonSerializer serializer = new JsonSerializer();
               StringWriter stringWriter = new StringWriter();
               using (JsonTextWriter writer = new JsonTextWriter(stringWriter))
               {
                   writer.QuoteName = false;  //项目名称不带引号
                   serializer.Serialize(writer, cf1);
                }
                string str1 = stringWriter.ToString();
                string str2 = "db.collection('col1').add({data: [" + str1 + "]})";
                return str2;
         }
    }

    2、再写出其他固定部分的内容。

    public class myclass2
    {
        public static string myproc2()
        {  
                   string str1 = myclass1.myproc1();
                   StringBuilder sb = new StringBuilder();
                   StringWriter sw = new StringWriter(sb);
                   using (JsonWriter writer = new JsonTextWriter(sw))
                   {
                      writer.Formatting = Formatting.Indented;
                      writer.WriteStartObject();
                      writer.WritePropertyName("env");
                      writer.WriteValue("env1");
                      writer.WritePropertyName("query");
                      writer.WriteValue(str1);  //嵌入data字串  
                      writer.WriteEndObject();
                    }
                    string str2 = sb.ToString();
                    return str2;
          }
    }

    所以比起像:
    {
       "item1"  : "value1",
       "item2"  : [{'a1':'b1', 'a2':'b2'}]
    }
    这样的结构,前面的例子要费事些。而这个只要按顺序写就行。因为这个的确是流式的:
    // ....
    writer.WriteStartObject();
      writer.WritePropertyName("item1");
      writer.WriteValue("value1");
      writer.WritePropertyName("item2");
      writer.WriteStartArray();
         writer.WriteStartObject();
            writer.WritePropertyName("a1");
            writer.WriteValue("b1");
            writer.WritePropertyName("a2");
            writer.WriteValue("b2");
         writer.WriteEndObject();
      writer.WriteEndArray();
    writer.WriteEndObject();
    // ....
    记述这段文字,以交流学习。

  • 相关阅读:
    数据结构——数据结构的起源和研究内容
    数据结构——学习数据结构的意义
    C++中动态内存申请的结果
    C++中函数异常规格的说明
    C++异常处理的深入理解
    NOIP 2012 Day2
    NOIP 2012 Day1
    NOIP 2011 Day2
    NOIP 2011 Day 1
    NOIP 2010
  • 原文地址:https://www.cnblogs.com/xyyztx/p/12411226.html
Copyright © 2011-2022 走看看