用 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();
// ....
记述这段文字,以交流学习。

posted @ 2020-03-04 19:03  capital2012  阅读(454)  评论(1编辑  收藏  举报