App.Data转换为json字符串



我正在尝试将2sxc App.Data转换为json字符串。

我试过了:

using System.Web.Script.Serialization;
var org = (IEnumerable<dynamic>)AsDynamic(App.Data["MyData"])
.Where(s => (s.Show == true ))
.OrderBy(n => n.Name);
string retour = new JavaScriptSerializer().Serialize(org);

但是我有一个错误Exception has been thrown by the target of an invocation.

知道如何返回这些数据的json字符串吗?

谢谢!

至少有三种方法可以做到这一点。你必须知道两件事:

  1. 原始实体可以引用其他实体(因为它们可能有关系)。如果你只是做一个琐碎的序列化,你可能很容易遇到无限循环(在几次递归后停止)
  2. 在内部,每个值都可以是多语言的,因此原始的内部格式可能不适合您尝试执行的任何操作

现在让我们看看您的场景:我假设您在Razor或WebApi中,并且希望以隐藏HTML(如<div data='{somejson}'>)的形式提供项目,或者从WebApi返回项目以供进一步使用。我还假设你不太关心语言或相关项目——这意味着你不想要完整的数据,只想要基本的阅读。

让我们看看您的选择:

(不推荐)对您来说,最容易完全控制的方法是创建一个包含值的字典,并序列化

(推荐)EAV和2sxc的方法是准备数据进行序列化,然后让序列化程序从那里获取数据。为了实现这一点,您可以在EAV中使用一个Serializer-对象。您可以在EAV/2sxc源代码中的大多数API调用中找到它-语法通常类似于

var Serializer = new ToSic.Eav.Serializers.Serializer();
return Serializer.Prepare(single-entity-or-Ienumerable-of-entities);

这实际上做了我之前提到的事情——它创建了一个Dictionary<field-name, value-object>,任何序列化程序都可以使用它。相关项目会自动转换为id+标题组合的列表,因此您可以在JS中使用它们,但无需交付所有子项目的整个树。

希望这能有所帮助;)

它工作得很好。非常感谢!

对于记录,以下是工作代码(DNN 9.1.1/2sxc 9.11.1),用于公开SxcApiController中一个简单表(无关系)中的数据,并能够在公开数据之前对数据进行操作。这个想法是添加在可视化查询中无法完成的操作。

[HttpGet]   
[AllowAnonymous]
public string showAllOrganisms()
{
IEnumerable<dynamic> org = (IEnumerable<dynamic>)AsDynamic(App.Data["Organisms"])
.Where(s => (s.Show == true ))
.OrderBy(n => n.Name);
var org2 = org.Select(AsEntity);
var Serializer = new ToSic.Eav.Serializers.Serializer();
var prepared = Serializer.Prepare(org2);
var jss = new JavaScriptSerializer();
var retour = jss.Serialize(prepared);
return retour;
}

最新更新