App.Data转换为json字符串

时间:2017-11-18 03:32:31

标签: 2sxc

我试图将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字符串吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

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

  1. 原始实体可以引用其他实体(因为它们可以有关系)。如果你只是做一个简单的序列化,你可能很容易遇到无限循环(在几次递归后停止)
  2. 内部的每个值都可以是多语言,因此原始内部格式可能不适合您尝试的任何操作。
  3. 现在让我们看一下你的场景:我假设你是在一个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 + title组合列表,因此您可以在JS中使用它们,但不会传递所有子项目的整个树。

    希望这会有所帮助;)

答案 1 :(得分:0)

完美无缺。非常感谢你!

对于记录,这里是工作代码(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;
}