问题描述
.Net向前台传送Json数据仅被识别为普通的string类型数据。
本次开发环境是.net Framework 4.7.2+微信小程序v2.16.0 (2021-03-03)+MongoDB4.4.4。
- 正确的情况:
应该是数组类型可以直接在js文件中调用。
- 错误的情况:
data中收到的message是“image_sec:http…”这样的普通字符串,无法采用json调用方式。
寻根溯源
正确的JSON数据格式有三种表示
1. 第一种(纯字典)
{key:value,key:value...}
2. 第二种(字典包着数组)
{key:[key:value,key:value],key:value...}
3. 第三种(数组包着字典)
[{key:value,key:value},{key:value}....]
要注意的是传递到前台的数据只有形如上述格式才能被识别,微信小程序的接受请求返回的数据时会再次调用JSON.Parse()方法将String转换为JSON。
因此针对微信小程序后台不必JSON序列化,仅仅需要保持字符串要形如上述三种格式。
这次我传回前台数据一直被识别为String而非JSON array,是因为后台从Mongo数据库查回的数据(就是下面这个从集合里查出来的数据)
Collection<BsonDocument>(“数据库”).Find(new BsonDocument).ToList().ToJson()
返回来的字符串之中有换行、空格的!!!!!!所以不被微信小程序识别。
并且我发现MongoDB中的
"_id": {
"$oid": "6048a00ede1b97b8bfececc8"
}
如果存在于传回的json中,也是不能被微信小程序识别的,所以一定要排除掉“_id”键值对。
解决方案
public string GetSwiperData()
{
string conn="mongodb://localhost:27017/?authSource=test"
var mongo=new MongoClient(conn);
var db=mongo.GetDatabase("test");
var collection = db.GetCollection<BsonDocument>("集合名");
//Projection用于排除特定的field
var projection= Builders<BsonDocument>.Projection.Exclude("_id");
//取出集合里的所有数据
var back = collection.Find(new BsonDocument()).Project(projection).ToList().ToJson();
//使用正则表达式\s匹配空格、回车并且删掉
string result = Regex.Replace(back, @"\s", "");
//为了在微信小程序方便取出给结果取个名叫做message
result ="{"+"\"message\""+":"+result+"}";
return result;
}