如何将lambda表达式转换为json字符串

时间:2018-09-19 20:27:26

标签: c# json linq

我有两个申请。一个应用程序将选项和配置保存为JSON,另一个应用程序读取JSON并根据JSON中的字段执行其任务。现在,我想过滤application-2中的列表。我该如何传递我希望列表被过滤成字符串以存储在JSON中,然后由application-2重新解释的方式?

是否有序列化linq / lambda表达式并反序列化它们?还是有更好的方法,例如创建一个包含一些可过滤选项的类,例如等于,不等于,大于,小于,包含等?

3 个答案:

答案 0 :(得分:1)

不幸的是,由于它是在编译时生成的,因此无法在c#中对lamda表达式进行序列化和序列化。

编译后的Lamda会生成一个函数,并且当使用lamda表达式时,编译器会调用此函数。

您有一个选择,但这并不容易:) yy必须将c#代码存储在json文件中,然后application-2将对其进行读取,解析,编译并执行。

但它不仅是一个lamdba表达式,还将是一个完整的程序集(像一个类)。

如果使用:net framrwork,请参考以下示例: https://www.codeproject.com/Tips/715891/Compiling-Csharp-Code-at-Runtime

如果使用.Net Core,则必须使用roslyn:https://josephwoodward.co.uk/2016/12/in-memory-c-sharp-compilation-using-roslyn

希望对您有所帮助

答案 1 :(得分:0)

如果要过滤纯JSON中的javascript数组,可以使用JpathJson.Net

例如:

var token = JToken.Parse("json string here")
var tokens = token.SelectTokens("$.YourJsonArray[?(@.Property == something)]")

答案 2 :(得分:0)

我找到了解决此问题的另一种方法。您可以从字符串存储和还原表达式! :)

唯一需要的是,两个模块(在您的情况下为两个程序)必须是已知的相同类型。

示例代码:

var discountFilter = "album => album.Quantity > 0";
var options = ScriptOptions.Default.AddReferences(typeof(Album).Assembly);

Func<Album, bool> discountFilterExpression = 
                  await CSharpScript.EvaluateAsync<Func<Album, bool>>(discountFilter, options);

var discountedAlbums = albums.Where(discountFilterExpression);

降级 gy