2016-11-05 54 views
1

讓說我有一個來自同一AJAX調用根據傳入的參數返回以下2個JSON對象可與2種不同的數據類型,同一屬性的JSON對象以相同的反序列化調用反序列化?

第一個返回的孩子屬性的字符串數組:

{ 
    parent: { 
     child: [ 
      "item 1", 
      "item 2", 
      "item 3", 
     ] 
    } 
} 

,第二個用於返回屬性的對象數組:

{ 
    parent: { 
     child: [ 
      { 
       "attribute1": "Attribute 1", 
       "attribute2": "Attribute 2", 
       "attribute3": "Attribute 3" 
      }, 
      { 
       "attribute1": "Attribute 1", 
       "attribute2": "Attribute 2", 
       "attribute3": "Attribute 3" 
      }, 
      { 
       "attribute1": "Attribute 1", 
       "attribute2": "Attribute 2", 
       "attribute3": "Attribute 3" 
      }, 
     ] 
    } 
} 

是否有可能反序列化任一成相同的模型不知何故?也許那裏有孩子(如ChildString & ChildObject)被相應地填充這取決於型2個不同的屬性?

我目前使用Jil的反序列化,但我對其他人開放如果需要的話。

謝謝!

+0

請參閱http://michaelcummings.net/mathoms/using-a-custom-jsonconverter-to-fix-bad-json-results/ – jmoreno

回答

0

你可以使用一個通用的類型child並通過兩種不同的類型取決於您的JSON:

class Parent<T> 
{ 
    public T child { get; set; } 
} 

class child 
{ 
    string attribute1 { get; set; } 
    string attribute2 { get; set; } 
    string attribute3 { get; set; } 
} 

var parentWithList = JsonConvert.DeserializeObject<Parent<List<string>>>(yourFirstJson); 

var parentWithSingleChild = JsonConvert.DeserializeObject<Parent<child>(yourSecondJson); 
0

一種解決方案可以嘗試類似下面的

using System; 
using System.Collections.Generic; 
using System.IO; 
using Jil; 

namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      var f=File.ReadAllText("requestAsString.json"); 
      var f1 = File.ReadAllText("requestAsObject.json"); 

      Root<List<string>> requestAsString = null; 
      try 
      { 
       requestAsString= JSON.Deserialize<Root<List<string>>>(f, Options.CamelCase); 
      } 
      catch (Exception) 
      {     
      } 
      Root<List<Child>> requestAsObject=null; 
      try 
      { 
       requestAsObject = JSON.Deserialize<Root<List<Child>>>(f1, Options.CamelCase); 
      } 
      catch (Exception) 
      {         
      } 





     } 
    } 

    class Root<T> 
    { 
     public Parent<T> Parent { get; set; } 
    } 
    class Parent<T> 
    { 
     public T Child { get; set; }   
    } 


    class Child 
    { 
     public string Attribute1 { get; set; } 
     public string Attribute2 { get; set; } 
     public string Attribute3 { get; set; } 
    } 


} 

但你應該確保您的要求是有效的(RFC 4627)

示例:

{ 
    "parent": { 
    "child": [ 
     "item 1", 
     "item 2", 
     "item 3" 
    ] 
    } 
} 
相關問題