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