App.Data 转换为 json 字符串
App.Data convert to json string
我正在尝试将 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.
知道如何 return 这些数据的 json 字符串吗?
谢谢!
至少有三种方法可以做到这一点。你必须知道的两件事:
- 原始实体可以引用其他实体(因为它们可以有关系)。如果你只是做一个简单的序列化,你可能很容易 运行 进入无限循环(在几次递归后停止)
- 在内部每个值都可以是多语言的,因此原始内部格式可能不适合您尝试做的任何事情。
现在让我们看看您的场景:我假设您在 Razor 或 WebApi 中,并希望提供隐藏的项目 HTML - 如 <div data='{somejson}'>
或 return 它来自 WebApi - 以供进一步使用。我还假设您不太关心语言或相关项目——这意味着您不需要完整的数据,只需要基本的阅读。
让我们看看您的选择:
(不推荐)最容易让您完全控制的是创建一个包含值的字典,并将其序列化
(推荐)EAV和2sxc的做法是准备序列化数据,然后让序列化器从那里拿走。为此,您可以使用 EAV 中的 Serializer
-object。您会在 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+title 组合列表,因此您可以在 JS 中使用它们,但无需提供所有子项的整个树。
希望对您有所帮助 ;)
效果很好。非常感谢!
作为记录,这里是工作代码 (DNN 9.1.1 / 2sxc 9.11.1),用于在 SxcApiController 中公开来自简单 table(无关系)的数据,并能够操纵暴露它们之前的数据。这个想法是添加在可视化查询中无法完成的操作。
[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;
}
我正在尝试将 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.
知道如何 return 这些数据的 json 字符串吗?
谢谢!
至少有三种方法可以做到这一点。你必须知道的两件事:
- 原始实体可以引用其他实体(因为它们可以有关系)。如果你只是做一个简单的序列化,你可能很容易 运行 进入无限循环(在几次递归后停止)
- 在内部每个值都可以是多语言的,因此原始内部格式可能不适合您尝试做的任何事情。
现在让我们看看您的场景:我假设您在 Razor 或 WebApi 中,并希望提供隐藏的项目 HTML - 如 <div data='{somejson}'>
或 return 它来自 WebApi - 以供进一步使用。我还假设您不太关心语言或相关项目——这意味着您不需要完整的数据,只需要基本的阅读。
让我们看看您的选择:
(不推荐)最容易让您完全控制的是创建一个包含值的字典,并将其序列化
(推荐)EAV和2sxc的做法是准备序列化数据,然后让序列化器从那里拿走。为此,您可以使用 EAV 中的 Serializer
-object。您会在 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+title 组合列表,因此您可以在 JS 中使用它们,但无需提供所有子项的整个树。
希望对您有所帮助 ;)
效果很好。非常感谢!
作为记录,这里是工作代码 (DNN 9.1.1 / 2sxc 9.11.1),用于在 SxcApiController 中公开来自简单 table(无关系)的数据,并能够操纵暴露它们之前的数据。这个想法是添加在可视化查询中无法完成的操作。
[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;
}