2012-05-11 61 views
6

我正在使用C#.NET 4.0將JSON解析爲自定義對象。我正在使用JavaScriptSerializer.Deserialize將其映射到我編寫的類。問題是,在JSON的名稱/值對是不是靜態的,取決於參數isChain,如在此JSON片段(在底部更好的鏈路):將具有變量名/值對的JSON反序列化爲C中的對象#

{ 
    "STATE_WALK_LEFT":{ 
     "isChain":"1", 
     "x":"1" 
    }, 
    "STATE_WALK_LEFT_0":{ 
     "x":"0" 
    }, 
    "STATE_WALK_LEFT_1":{ 
     "x":"40" 
    }, 
    "STATE_WALK_LEFT_2":{ 
     "x":"80" 
    }, 
    "STATE_WALK_RIGHT":{ 
     "isChain":"0" 
    }, 
    "STATE_RUN_LEFT":{ 
     "isChain":"0" 
    } 
} 

鏈可以在任何地方從_STATE_0到_STATE_25項在鏈子裏。是否有某種方式來存儲這些數據,所以我沒有寫12個* 26空類,像這樣:

public StateWalkLeft0 STATE_WALK_LEFT { get; set; } 
public StateWalkLeft0 STATE_WALK_LEFT_0 { get; set; } 
public StateWalkLeft1 STATE_WALK_LEFT_1 { get; set; } 
public StateWalkLeft2 STATE_WALK_LEFT_2 { get; set; } 
public StateWalkLeft3 STATE_WALK_LEFT_3 { get; set; } 

是否有一個圖書館或一些其他的方式,我可以用它來解析部分僅 STATE_0 ,STATE_1等字段?你可能會建議一種方法來添加這些最近添加的JSON對嗎?

編輯,以澄清: 得到什麼我的工作的想法,這裏是從JSONs派生的類:

Check out my full Class to get an idea of what the JSONs contain

基本上,我只需要一種方法來存儲這些最近在這個類中以某種方式實現了鏈處理。所有這些類/屬性都是從這些JSON生成的。

+7

「我寧願不使用遞歸,第三方庫或反序列化到var/dynamic。」祝你好運找到在這些邊界內的解決方案 –

+1

你可以用[Json.NET](http://json.codeplex.com/) – casperOne

+0

@casperOne +1輕鬆地做到這一點,但我會提出建議使用[fastJSON](http://www.codeproject.com/Articles/159450/fastJSON)。 Json.NET非常慢且很大,並且由於其複雜性而難以進行修改。 – erodewald

回答

2

使用Newtonsoft Json.NET和例如下面的代碼

internal struct ChainX 
{ 
    public int x { get; set; } 
    public int isChain { get; set; } 
} 

    static string json = 
@"{ 
    ""STATE_WALK_LEFT"":{ 
     ""isChain"":""1"", 
     ""x"":""1"" 
    }, 
    ""STATE_WALK_LEFT_0"":{ 
     ""x"":""0"" 
    }, 
    ""STATE_WALK_LEFT_1"":{ 
     ""x"":""40"" 
    }, 
    ""STATE_WALK_LEFT_2"":{ 
     ""x"":""80"" 
    }, 
    ""STATE_WALK_RIGHT"":{ 
     ""isChain"":""0"" 
    }, 
    ""STATE_RUN_LEFT"":{ 
     ""isChain"":""0"" 
    } 
}"; 

和一行代碼反序列化到詞典:後

var values = JsonConvert.DeserializeObject<Dictionary<string, ChainX>>(json); 

你可以簡單的訪問值按字典的鍵:

ChainX valueWalkLeft1 = values["STATE_WALK_LEFT_1"]; 
+0

問題是,我的JSON包含各種其他多級條目 - 請查看我的編輯以澄清。 Json.NET是否支持某種條件或者子反序列化?如果可以的話,我會給你+1,因爲你在我提供的上下文中回答了這個問題。我的錯誤不夠明確。 – br4d

+1

Json.NET解決了你的問題。您可以像我在示例中那樣反序列化爲一個類型化對象。那裏有很多方法和重載。因此,您可以使用其中的一個來生成Dictionary 或內部Json.NET對象,然後您可以按節點反序列化樹節點。如果它會出現問題,請在這裏留下評論 – Regfor

+0

您的解決方案與TypeBuilder/Reflection一起解決了我的問題。非常感謝。 – br4d