在c#中使用JUST,是否可以规范化双序列化?



我们有一个微服务,它接收来自Salesforce的事件,然后将它们发布到Azure服务总线。

Salesforce事件通常不能包含子记录或列表。作为一种hack,我们正在序列化这些数据并将其填充到一个长文本中。

我们的微服务有能力接受Salesforce输入,并在将结果转发到Azure服务总线之前将JUST模板应用于输入。JUST代表"简单转换下的JSON";这是一个转换JSON的库,类似于XSL如何转换XML。

因此,我们可能会收到一个JSON,看起来像:
{
"data": {
"schema": "zowqvqZB821tITs2yGoDPQ",
"payload": {
"Account__c": "{"BillingCity__c":"Frankfurt0.7402008498784405","BillingCountry__c":"Germany0.034598927398245216"}",
"OpportunityLineItems__c": "[{"SystemName__c":"SF","Currency__c":"EUR"},{"SystemName__c":"SF","Currency__c":"USD"}]"
},
"event": {
"replayId": 5507836
}
},
"channel": "/event/Contract__e"
}

我们想要规范化这种双序列化数据,将包含JSON的字符串转换为未包装的对象或数组。所以,它应该像这样结束:

{
"data": {
"schema": "zowqvqZB821tITs2yGoDPQ",
"payload": {
"Account__c": {
"BillingCity__c": "Frankfurt0.7402008498784405",
"BillingCountry__c": "Germany0.034598927398245216"
},
"OpportunityLineItems__c": [
{
"SystemName__c": "SF",
"Currency__c": "EUR"
}, 
{
"SystemName__c": "SF",
"Currency__c": "USD"
}]
},
"event": {
"replayId": 5507836
}
},
"channel": "/event/Contract__e"
}

我尝试创建以下自定义函数:

using LanguageExt;
using Newtonsoft.Json.Linq;
using System;
namespace Salesforce.EventListener.Just.CustomFunctions;
public class NormalizeSerialization
{
public static Either<JToken, string> TryUnquote(string quotedJson)
{
try
{
return JToken.Parse(quotedJson);
}
catch (Exception)
{
return quotedJson;
}
}
}

,然后在JUST模板中包含对this的调用,如:

{
"account": "#customfunction(Salesforce.EventListener.Just.CustomFunctions,Salesforce.EventListener.Just.CustomFunctions.NormalizeSerialization.TryUnquote,#valueof($.payloadProperties.Account__c))"
}

但是结果是

系统。异常:` `调用函数时出错:# customfunction (Enpal.Salesforce.EventListener.Just.CustomFunctions Enpal.Salesforce.EventListener.Just.CustomFunctions.NormalizeSerialization.TryUnquote #返回对象的值(.payloadProperties.Account__c美元))

  • 值不能为空。(参数类型)

将断点放入静态函数中没有帮助,因为系统似乎无法从函数中中断。

我怎样才能使它工作?

我修改我的Normalizer看起来像这样:

public class Normalizer
{
public static object TryUnquote(object value)
{
try
{
return value is string quotedValue
? JToken.Parse(quotedValue)
: value;
}
catch (Exception)
{
return value;
}
}
}

,然后像这样在JsonTransformer上注册:

public static IServiceCollection AddJustCustomFunctions(this IServiceCollection services)
{
_ = Assembly.GetAssembly(typeof(Normalizer));
JUSTContext context = new();
context.RegisterCustomFunction("Enpal.JUST.CustomFunctions", "CustomFunctions.Normalizer", "TryUnquote", "tryunquote");
return services.AddSingleton(new JsonTransformer(context));
}

最新更新