2017-11-18 69 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; 
}