2015-04-24 42 views
2

我遇到了JSON DeserializeObject方法的問題。JSON反序列化一個或兩個數組

當我的XML文檔在Braches節點內只有一個Branch時,我得到一個錯誤,因爲我的類下面說分支是一個列表。我不確定如何繼續此操作,因爲<Branches>內可能有一個<Branch>或多個<Branch>

這是我的錯誤消息:

其他信息:不能反序列化當前JSON對象 (例如{ 「名稱」: 「值」})到類型 'PluginConsoleTestCode.Branch []' 因爲該類型需要一個JSON數組(例如[1,2,3])來正確地反序列化 。

爲了解決這個錯誤或者改變JSON到JSON陣列(例如 [1,2,3]),或改變它的反序列化類型,以便它是一個正常的.NET 類型(例如不是原始類型像整數,而不是類似數組或列表的集合類型 ),它們可以從JSON對象反序列化。 也可以將JsonObjectAttribute添加到該類型中,以強制它從一個JSON對象反序列化爲 。

路徑 'Openers.Opener [2] .Branches.Branch @ ID。',1號線,位置689

我的代碼段:

// XML to JSON then JSON to RootObject 
var json = JsonConvert.SerializeXmlNode(xmlDoc); 
var response = JsonConvert.DeserializeObject<RootObject>(json); 

這裏是我的XML :

<Openers> 
    <Opener Name="Name1" UserId="username"> 
     <Branches> 
      <Branch id="103"></Branch> 
      <Branch id="104"></Branch> 
      <Branch id="105"></Branch> 
      <Branch id="106"></Branch> 
      <Branch id="107"></Branch> 
      <Branch id="108"></Branch> 
     </Branches> 
    </Opener> 
    <Opener Name="Name2" UserId="username"> 
     <Branches> 
      <Branch id="109"></Branch> 
      <Branch id="110"></Branch> 
      <Branch id="111"></Branch> 
      <Branch id="112"></Branch> 
     </Branches> 
    </Opener> 
    <Opener Name="Name3" UserId="username"> 
     <Branches> 
      <Branch id="113"></Branch> 
     </Branches> 
    </Opener> 
</Openers> 

XML便利着想rted到JSON:

{ 
    "Openers": { 
    "Opener": [ 
     { 
     "@Name": "Name1", 
     "@UserId": "username", 
     "Branches": { 
      "Branch": [ 
      { "@id": "103" }, 
      { "@id": "104" }, 
      { "@id": "105" }, 
      { "@id": "106" }, 
      { "@id": "107" }, 
      { "@id": "108" } 
      ] 
     } 
     }, 
     { 
     "@Name": "Name2", 
     "@UserId": "username", 
     "Branches": { 
      "Branch": [ 
      { "@id": "109" }, 
      { "@id": "110" }, 
      { "@id": "111" }, 
      { "@id": "112" } 
      ] 
     } 
     }, 
     { 
     "@Name": "Name3", 
     "@UserId": "username", 
     "Branches": { 
      "Branch": { "@id": "113" } 
     } 
     } 
    ] 
    } 
} 

這是我的職業:

public class Branch 
{ 
    [JsonProperty("@id")] 
    public string Id { get; set; } 
} 

public class Branches 
{ 
    [JsonProperty("Branch")] 
    public List<Branch> Branch { get; set; } 
} 

public class Opener 
{ 
    [JsonProperty("@Name")] 
    public string Name { get; set; } 
    [JsonProperty("@UserId")] 
    public string UserId { get; set; } 
    public Branches Branches { get; set; } 
} 

public class Openers 
{ 
    public List<Opener> Opener { get; set; } 
} 

public class RootObject 
{ 
    public Openers Openers { get; set; } 
} 
+1

你在JSON中有'-UserId'和'-Name'。 –

+0

@ DanielA.White和'-id'而不是'id' – Alex

+0

其實,這是一個錯誤。 JSON響應會返回@ Id和@ UserId和@名稱。這不是問題。在代碼中修復。 – Turp

回答

0

可以使用屬性json:Array強制轉換到一個節點轉換成數組。

http://www.newtonsoft.com/json/help/html/ConvertXmlToJsonForceArray.htm

在您的例子就應該是這樣的

<Openers xmlns:json='http://james.newtonking.com/projects/json' json:Array='true'> 
<Opener Name="Name1" UserId="username"> 
    <Branches json:Array='true'> 
     <Branch id="103"></Branch> 
     <Branch id="104"></Branch> 
     <Branch id="105"></Branch> 
     <Branch id="106"></Branch> 
     <Branch id="107"></Branch> 
     <Branch id="108"></Branch> 
    </Branches> 
</Opener> 
<Opener Name="Name2" UserId="username"> 
    <Branches json:Array='true'> 
     <Branch id="109"></Branch> 
     <Branch id="110"></Branch> 
     <Branch id="111"></Branch> 
     <Branch id="112"></Branch> 
    </Branches> 
</Opener> 
<Opener Name="Name3" UserId="username"> 
    <Branches json:Array='true'> 
     <Branch id="113"></Branch> 
    </Branches> 
</Opener> 
</Openers> 
+0

我在這裏得到一個錯誤... – Turp

+0

@Turp你在這個上遇到什麼錯誤? –

+0

附加信息:由於該類型需要JSON數組(例如,[[ 1,2,3])來正確反序列化。 – Turp

0

爲什麼你有這麼複雜的結構? 爲什麼你不只有以下

public class Branch 
{ 
    [JsonProperty("@id")] 
    public string Id { get; set; } 
} 

public class Opener 
{ 
    [JsonProperty("@Name")] 
    public string Name { get; set; } 
    [JsonProperty("@UserId")] 
    public string UserId { get; set; } 
    [XmlArray("Branches")] 
    [XmlArrayItem("branch", typeof(Branch))] 
    public List<Branch> Branches { get; set; } 
} 


public class RootObject 
{ 
    [XmlArray("Openers")] 
    [XmlArrayItem("opener", typeof(Opener))] 
    public List<Opener> Openers { get; set; } 
} 

其他屬性應該是自動工作。如果沒有,請全部添加XMLAttributeXMLElement

編輯:爲什麼使用json.net反序列化xml,當存在系統xmlserializers?

+0

這不適合我。我收到一條錯誤消息。 '附加信息:不能反序列化當前JSON對象(例如{「name」:「value」})到類型'System.Collections.Generic.List'1 [PluginConsoleTestCode.Opener]'中,因爲該類型需要JSON數組(例如[ 1,2,3])來正確反序列化。 Path'Openers.Opener',line 1,position 21. – Turp

+0

對不起,我已經找到了一些[回購](https://bitbucket.org/maiksaray/xmltojsonymltesttask/)與一些測試任務,我做了一個在你問題之前的一個月,忘記了這就是你需要的一切。 Xml - > objects - > json,使用json.net和嵌套的數據列表(鏈接到數據在解決方案中的某處) – maiksaray