關鍵字:Json Mock 引數模擬 隨機生成Json C# .NET
最近在做一個JsonMock功能的功能,最后呈現的效果,大概就是輸入一串Json字串,然后指定其中某個引數(并檢測其型別) 生成隨機資料,
上GitHub搜索過很多關鍵字但是都不滿足自己的需求,最后自己實作了一個思路大致就是將Json->陣列->Json,我們可以將Json轉成泛型陣列,并在泛型陣列寫入對應的屬性名,型別等資訊,這樣我們就將對Json字串的直接Mock轉化成了對陣列進行Mock,然后拼裝回Json,所以寫了一套演算法實作對Json字串的拆分以及拼裝,這里需要以.net core3.0為基礎,因為要使用較高版本的System.Text.Json
1.創建對應的中間類
using System.Text.Json;
namespace JsonMock1
{
public class JsonKeyValue
{
public string ObjectName { get; set; }
public string Name { get; set; }
public JsonValueKind ValueType { get; set; }
public object Value { get; set; }
}
}
2.撰寫對應拆分方法和轉換類(寫的不是很好,目前還不是很好地能拆分陣列型別)
using System;
using System.Buffers;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Threading;
using Newtonsoft.Json;
namespace JsonMock1
{
class Program
{
static void Main(string[] args)
{
using var stream = File.OpenRead("sample.json");
using var doc = JsonDocument.Parse(stream);
var root = doc.RootElement;
var jsonKeyValues = new List<JsonKeyValue>();
ReadJsonKeyValue(root, jsonKeyValues);
WriteJsonFromJsonKeyValue(jsonKeyValues);
Console.ReadKey();
}
private static void ReadJsonKeyValue(JsonElement root, ICollection<JsonKeyValue> jsonKeyValues, string objectName="")
{
foreach (var prop in root.EnumerateObject())
{
if (prop.Value.ValueKind == JsonValueKind.Object)
{
var newJsonKeyValue = new JsonKeyValue() {ObjectName =(string.IsNullOrEmpty(objectName)? prop.Name : $"{objectName}:{prop.Name}")};
jsonKeyValues.Add(newJsonKeyValue);
ReadJsonKeyValue(prop.Value, jsonKeyValues, newJsonKeyValue.ObjectName);
}
else
{
jsonKeyValues.Add(new JsonKeyValue() { ObjectName = objectName, Name = prop.Name, Value = prop.Value.GetRawText(), ValueType = prop.Value.ValueKind});
}
}
}
private static string WriteJsonFromJsonKeyValue(List<JsonKeyValue> jsonKeyValues)
{
var buffer = new ArrayBufferWriter<byte>();
var jswOpt = new JsonWriterOptions() { Indented = true, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping };
var json = new Utf8JsonWriter(buffer,jswOpt);
if (!jsonKeyValues.Any())
{
return "{}";
}
json.WriteStartObject();
for (var i = 0; i < jsonKeyValues.Count; i++)
{
if (jsonKeyValues[i].ValueType==JsonValueKind.Undefined)
{
json.WriteStartObject(jsonKeyValues[i].ObjectName);
int j = i + 1;
while (j<jsonKeyValues.Count&&(jsonKeyValues[j].ObjectName.Contains(jsonKeyValues[i].ObjectName)))
{
if (jsonKeyValues[j].ValueType==JsonValueKind.Number)
{
json.WriteNumber(jsonKeyValues[j].Name, Convert.ToDecimal(jsonKeyValues[j].Value));
}
if (jsonKeyValues[j].ValueType==JsonValueKind.String)
{
if (jsonKeyValues[j].Value is string str)
{
json.WriteString(jsonKeyValues[j].Name,str.TrimStart('\"').TrimEnd('\"'));
}
else
{
json.WriteString(jsonKeyValues[j].Name, jsonKeyValues[j].Value.ToString());
}
}
if (jsonKeyValues[j].ValueType == JsonValueKind.True||jsonKeyValues[j].ValueType==JsonValueKind.False)
{
json.WriteBoolean(jsonKeyValues[j].Name,Convert.ToBoolean(jsonKeyValues[j].Value));
}
if (jsonKeyValues[j].ValueType == JsonValueKind.Array)
{
json.WriteStartArray(jsonKeyValues[j].Name);
json.WriteCommentValue(jsonKeyValues[j].Value.ToString().TrimStart('[').TrimEnd(']'));
json.WriteEndArray();
}
j++;
}
i = j-1;
json.WriteEndObject();
}
}
json.WriteBoolean("IsSuccess", true);
json.WriteNumber("ErrorCode", 0);
json.WriteString("Message", "這是一個mock資料");
json.WriteString("OperationId", "123456");
json.WriteEndObject();
json.Flush();
var output = buffer.WrittenSpan.ToArray();
var outJson = Encoding.UTF8.GetString(output).Replace("/*","").Replace("*/","");
Console.WriteLine(outJson);
return outJson;
}
}
}
3.最后實作可以實作的效果

4.非常變態的資料自己手動Mock吧,,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/236631.html
標籤:其他
上一篇:20級大資料1班第6次堂測題解
下一篇:需求工程期末知識點復習
