[英]how to convert json to object, like CQRS design pattern
我有一個問題,我需要將 json 轉換為 C# 對象。 但是這個 json 可以有不同的屬性,這使得在轉換時有必要像使用 switch case 一樣檢查對象是否有效。
我在 CQRS 中看到設計模式似乎有一些共同點,有人知道它是如何工作的嗎? 以便我可以實施它。
public List<Event> process(CreateOrderCommand cmd) {
return EventUtil.events(new OrderCreatedEvent(cmd.getCustomerId(), cmd.getOrderTotal()));
}
public List<Event> process(ApproveOrderCommand cmd) {
return EventUtil.events(new OrderApprovedEvent(customerId));
}
public List<Event> process(RejectOrderCommand cmd) {
return EventUtil.events(new OrderRejectedEvent(customerId));
}
如您所見,所有方法名稱都相同,但參數不同。 我想實現這一點,以便當我得到 json 時,它將根據有效對象進行轉換。
我目前所做的:
public bool TryParseJson<T>(string @this, out T result)
{
bool success = true;
var settings = new JsonSerializerSettings
{
Error = (sender, args) => { success = false; args.ErrorContext.Handled = true; },
MissingMemberHandling = MissingMemberHandling.Error
};
result = JsonConvert.DeserializeObject<T>(@this, settings);
return success;
}
public void Process(JObject query)
{
RandomUser randomUser;
RecurringProcess recurringProcess;
if (TryParseJson(query.ToString(), out randomUser))
{
//do something with the object
}
else if (TryParseJson(query.ToString(), out recurringProcess))
{
//do something with the object
}
}
我認為這與 CQRS 沒有任何關系。 如果您想確定您正在構造一個有效的對象,請使用 Newtonsoft.JSON 的功能使用帶參數的構造函數反序列化您的 JSON。 根據您的需要定制對象的構造函數,這樣您就可以保證自己總是在構造一個有效的對象。 如果存在驗證錯誤,則拋出必要的異常並在此過程中捕獲它們。
我會建議你使用模式。 您可以使用 JSON.Net 創建一個 JSON 模式並根據該模式驗證 JSON 文件,如下所示:
JsonSchema schema = JsonSchema.Parse(jsonSchema);
JObject obj = JObject.Parse(jsonString);
bool valid = obj.IsValid(schema);
所以,你可以根據你的需要做這樣的事情。
// initialize this dictionary somewhere which maps schemas to command classes
Dictionary<JsonSchema, CommandBaseClass> jsonSchemaToCommandMapping;
public CommandBaseClass FindCommand(string @this, out DeserializeObjectsBaseType result)
{
// loop through schemas in the jsonSchemaToCommandMapping
// to find out which command class to use
return calculatedCommand;
}
public void Process(JObject query)
{
var commandClass = FindCommand(query.ToString(), out DeserializeObjectsBaseType deserializeObject);
// remember to check if command is null. maybe it was not found
commandClass?.Process(deserializeObject);
}
但請記住,我快速制作的這個例子很短,而且不是最漂亮的。 只是想告訴你我的想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.