2017-09-21 74 views
2

我有我想DeserializeObject與innerDictionary和innermostClass一個outerDictionary作爲所以JSON:反序列化嵌套JSON到詞典,串和類

var entityMap = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, fieldClass>>>(File.ReadAllText("map.json")); 

然而,innerDictionary可以具有字符串:字符串而不是string:innerMostClass。

{ 
"Client": { 
    "__class__": "contact", 

    "ClientId": { 
     "__field__": "new_ndisclientid", 
     "__type__": "string" 
    }, 
    "GivenName": { 
     "__field__": "firstname", 
     "__type__": "string" 
    }, 
}, 
"Case": { 
    "__class__": "contact", 

    "CaseId": { 
     "__field__": "new_ndiscaseid", 
     "__type__": "string" 
    } 
} 
} 

有沒有辦法做到這一點?我不想把它全部放到類中。

是否有可能使用自定義JsonConverter來做到這一點?

編輯:爲清晰起見,將classname重命名爲entityName。 ClientId和GivenName將被反序列化爲fieldClasses。

回答

2

您可以使用動態或如果你想分開內部類

public class Client 
{ 
    public string __entityName__ { get; set; } 
    public Dictionary<string, string> ClientId { get; set; } 
    public Dictionary<string, string> GivenName { get; set; } 
} 
var deserializedWithClass = JsonConvert.DeserializeObject<Dictionary<string, Client>>(json); 
+0

我試過動態的,但希望它是一類或類似物體,而不是內部類

var json = "{\r\n\t\"Client\": {\r\n\t\t\"__entityName__\": \"contact\",\r\n\r\n\t\t\"ClientId\": {\r\n\t\t\t\"__field__\": \"new_ndisclientid\",\r\n\t\t\t\"__type__\": \"string\"\r\n\t\t},\r\n\t\t\"GivenName\": {\r\n\t\t\t\"__field__\": \"firstname\",\r\n\t\t\t\"__type__\": \"string\"\r\n\t\t}\r\n\t}\r\n}"; var deserialized = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, dynamic>>>(json); List<object> values = deserialized.SelectMany(result => result.Value).Cast<object>().ToList(); 

,如果可能的話。我希望該類具有方法,並且動態數據類型在Visual Studio中沒有IntelliSense。 –

+0

使用類而不是動態更新答案 – Abhay

+0

將根變爲類是另一種方法。但我認爲它必須是一個Dictionary/List,因爲根並不總是一個Client。可能會說,一個具有不同內部類別的案例,但它們具有相同的字段。我已經更新了原來的帖子JSON以顯示我的意思。 –