2011-08-10 26 views
7

我正在使用fastJSON,我遇到了問題。我不能接受JSON字符串並將其轉換爲對象集合。如何使用FastJson從Json字符串轉到對象集合

我認爲它可以處理這個,但也許我做錯了或誤解。

把手對象具有多態性集合

下面是一個例子,我在C#CMD行應用程序做了(剛下載的.cs文件,並添加到項目,並複製如下代碼來測試)。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<Class1> store = new List<Class1>(); 
      for (int i = 0; i < 3; i++) 
      { 
       Class1 c = new Class1(); 
       c.Name = "test"; 
       c.Start = DateTime.Now; 
       store.Add(c); 
      } 

      string jsonResult = fastJSON.JSON.Instance.ToJSON(store); 

      List<Class1> backToObject = fastJSON.JSON.Instance. 
       ToObject<List<Class1>>(jsonResult); 
     } 
    } 

    public class Class1 
    { 
     public string Name { get; set; } 
     public DateTime Start { get; set; } 
    } 
} 

backToObject始終爲空。

我使用的是fastJSON,因爲我需要的東西確實對.NET庫沒有依賴關係,我正在使用monodroid(並且可能稍後會單擊),它在您可以使用和不能使用的東西中非常挑剔。

例如我不能使用Json.net庫(我認爲有一個用於monodroid,但我試圖讓我的代碼在我做iPhone部件時可重用)。

+0

Monodroid是否支持dynamic關鍵字?如果是這樣,你可以使用我的解析器FridayThe13th:http://procbits.com/2011/08/11/fridaythe13th-the-best-json-parser-for-silverlight-and-net/它不使用任何非標準。 NET庫。 –

+0

哦,哎呀..我只是意識到,你想序列化和對象,而不是反序列化一個JSON字符串。星期五13日還不支持。 –

回答

4

您不應該使用ToObject來反序列化數組。相反,您應該使用Parse方法來解析JSON。

當使用ToObject,你是假設你有在JSON對象正被反序列化(不是一個數組,或者標量值)的一個實例,具有Parse,它將處理被序列化爲JSON和任何類型返回適當的類型。

在這種情況下,調用Parse並通過jsonResult它會返回一個ArrayList其中包含三個實例:

ArrayList arrayList = fastJSON.JSON.Instance.parse(jsonResult) as ArrayList; 

但問題是,現在你有一個包含數Dictionary<string, object>實例的ArrayList其中具有映射到屬性名稱的標量值(或其他Dictionary<string, object>實例,在引用的情況下)。

我把它歸類爲一個bug。我希望解析一個數組來正確處理這個問題。

您可以修改ParseArray的代碼,以便在對array.Add進行調用時嗅探類型。

這仍然留下ParseNumber(可能被調用)返回一個字符串的問題。這可能會或可能不會影響你。

我會做任何你需要的改變以及file an issue with the issue tracker on the CodePlex project site

4

請注意,從fastJSON 2.x開始,OP代碼基本上應該可以正常工作(請注意,語法稍有變化)。

List<Class1> wallets = JSON.ToObject<List<Class1>>(json);