2017-11-18 84 views
0

我试图将2sxc App.Data转换为json字符串。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字符串?

谢谢!

回答

0

这样做至少有三种方法。有两件事你必须知道:

  1. 原始实体可以引用其他实体(因为他们可能有关系)。如果你只是做一个简单的序列化,你可能会很容易遇到无限循环(在几次递归后会停止),因为每个值都可以是多语言的,所以原始内部格式可能不适合你试图去做。

现在,让我们看看你的情景:我假设你是在一个刀片或其他的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中使用它们,但不交付所有子项目的整个树。

希望这有助于;)

+0

谢谢丹尼尔,这真的很清楚。你完全理解了上下文。我试图在我的控制器,但我收到此错误: 错误CS1502:最好的重载方法匹配'ToSic.Eav.Serializers.Serializer.Prepare(ToSic.Eav.DataSources.IDataSource,System.Collections.Generic。IEnumerable的)”有一些无效参数 我的代码看起来很简单: VAR组织= IEnumerable的)AsDynamic(App.Data [ “生物”]) ; var Serializer = new ToSic.Eav.Serializers.Serializer(); return Serializer.Prepare(org); 任何想法为什么我有这个错误?谢谢! –

+0

您的组织对象似乎有错误的类型。 Prepare似乎期望IEntity或IEnumerable 。你的'org'是IEnumerable 。试试AsEntity(org)。由于AsEntity一次只能处理1个项目,因此您可能需要类似'var org2 = org.Select(AsEntity);' – iJungleBoy

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; 
}