2015-10-01 57 views
0

我正在從API接收JSON字符串,這種字符串的結構不是在應用程序中處理的好方法。C#自定義對象的序列化列表

我選擇爲這個JSON數據創建一個自定義串行器(而不是在應用程序中接收和使用的數據有兩個不同的類)。

以下很多教程,我設法將單個對象的自定義串行器放在一起。但是,我需要處理這些對象的列表(這些怪異列表中會有更多不同的數據,需要自定義處理)。

有沒有內置的方法,我可以設置我的自定義serialiser與列表中的每個對象一起工作?還是我需要手動拆分JSON對象,並將它的大塊餵給自定義的序列化程序?

任何其他建議如何處理這種情況表示讚賞。

用戶類:

[JsonConverter(typeof(UserSerializer))] 
    public class User 
    { 
     public int id; 
     public string displayName; 
     public string email; 
     public int total_points; 
     public float total_values; 
    } 

的解串器:

public override object ReadJson(JsonReader reader, Type objectType, 
      object existingValue, JsonSerializer serializer) 
     { 
      JObject jObjectRoot = JObject.Load(reader); 
      var root = jObjectRoot.Properties().ToList(); 
      JObject jObjectData = JObject.Load(root[2].Value.CreateReader()); 
      var data = jObjectData.Properties().ToList(); 
      return new User { 
       id = (int)root[1].Value, 
       displayName = (string)data[0].Value, 
       email = (string)data[1].Value, 
       total_points = (int)data[2].Value, 
       total_values = (float)data[3].Value 
      }; 
     } 

UPDATE:

也是解析JSON字符串到單個用戶對象的代碼:

public static void ProcessJSON(string json) 
{ 
    User user = JsonConvert.DeserializeObject<User>(json); 
} 

和JS本身:

[ 
    { 
    "type": "users", 
    "id": 1, 
    "attr": { 
     "display_name": "user2", 
     "email": "[email protected]", 
     "total_points": 4, 
     "total_values": 32.34 
    }, 
    "relationships": { 
     "points_received": { 
     "links": { 
      "self": "tipjar/users/1/relationships/points", 
      "related": "tipjar/users/1/points" 
     } 
     }, 
     "points_given": { 
     "links": { 
      "self": "tipjar/users/1/relationships/awarded", 
      "related": "tipjar/users/1/awarded" 
     } 
     } 
    } 
    } 
] 

感謝

+0

你看着使用Newtonsoft JSON.NET? –

+0

JSON的外觀如何? –

+0

@GlenThomas是的,我正在使用Newtonsoft JSON.NET – Kiaurutis

回答

2

你可以得到用戶對象的列表,而自定義轉換是這樣的:

var userList = JArray.Parse(json) 
    .Select(t => new User() 
    { 
     id = int.Parse(t["id"].ToString()), 
     displayName = t["attr"]["display_name"].ToString(), 
     email = t["attr"]["email"].ToString(), 
     total_points = int.Parse(t["attr"]["total_points"].ToString()), 
     total_values = float.Parse(t["attr"]["total_values"].ToString()), 
    }).ToList(); 
+0

洛爾這個工程就像一個魅力,沒有寫複雜的轉換器。非常感謝:) – Kiaurutis

+1

作爲一項小改進,Json.Net支持將'JValues'直接轉換爲它們相應的基本類型,因此您可以執行'total_points =(int)t [「attr」] [「total_points」]'而不是使用'ToString()'然後'int.Parse()' –

+0

@BrianRogers:謝謝,很高興知道 –

-1
public static void ProcessJSON(string json) 
{ 
    User u = new User(); 
    var test = JsonConvert.DeserializeObject(json); 
    if (test.GetType() == typeof(User)) 
     u = (User)test; 

} 

不上連載如何工作的100%,但似乎對測試程序我做的工作。

這可能有點愚蠢。但是,你可以測試在不同類型的返回的對象......

+0

對不起,這根本不起作用。如果你沒有在'DeserializeObject'中指定一個類型,那麼它將是一種'JToken',它不是'User'。所以用戶'u'將始終具有默認值。即使您指定'User'作爲DeserializeObject的類型參數,JSON也不匹配OP定義的User類。您的回答並未顯示如何處理這種不匹配,也沒有說明如何處理用戶列表。這是OP在這裏試圖解決的問題的關鍵。 –

+0

然後回到繪圖板。我會對此做更多的研究。謝謝:) –