2010-01-28 187 views
3

我有一個大的對象回來,我只需要一小部分數據。我正在看例子here。我基本上想要做同樣的事情,除了問題是我會有一個「錯誤」對象的數組。JSON數組對象到.NET對象

因此,它看起來像這樣

{ 
    "short": { 
     "original": "http://www.foo.com/", 
     "short": "krehqk", 
     "error": [ 
      { 
       "code": 0, 
       "msg": "No action taken" 
      }, 
      { 
       "code": 0, 
       "msg": "No action taken" 
      } 
     ] 
    } 
} 

有一種簡單的方式來完成這項使用JObject.Parse或者甚至LINQ到JSON?我最好只使用JsonConvert.DeserializeObject,而不包括我創建的.NET對象中不需要的屬性/對象?

UPDATE 使用上述這裏的JSON是我的測試...

[TestMethod] 
public void ParseStuffTest() 
{ 
    JObject json = JObject.Parse(shortJson); 

    Shortie shortie = new Shortie 
    { 
     Original = (string)json["short"]["original"], 
     Short = (string)json["short"]["short"], 
     Error = new ShortError 
     { 
      Code = (int)json["short"]["error"]["code"], 
      ErrorMessage = (string)json["short"]["error"]["msg"] 
     } 
    }; 
    Assert.IsNotNull(shortie); 
} 

public class Shortie 
{ 
    [JsonProperty] 
    public string Original { get; set; } 

    [JsonProperty] 
    public string Short { get; set; } 

    [JsonProperty] 
    public List<ShortError> Error{ get; set; } 
} 

public class ShortError 
{ 
    [JsonProperty] 
    public int Code { get; set; } 
    [JsonProperty] 
    public string ErrorMessage { get; set; } 
} 

以下是錯誤:無法隱式轉換類型 'Unit_Tests.Test.ShortError' 到「System.Collections.Generic。清單」

我缺少什麼?


這就是我想出了......我只是不喜歡它,因爲我的工作的真正目的,就是要大得多,也有與數組對象多個屬性。這是我唯一的選擇嗎? (除了明顯的JsonConvert.Deserialize)

[TestMethod] 
public void ParseStuffTest() 
{ 
    JObject json = JObject.Parse(shortJson); 
    var errors = json["short"]["error"].Children().ToList(); 
    var shortErrors = new List<ShortError>(); 
    foreach (var error in errors) 
    { 
     var shortError = new ShortError 
          { 
           Code = (int)error["code"], 
           ErrorMessage = (string)error["msg"] 
          }; 
     shortErrors.Add(shortError); 
    } 
    var shortie = new Shortie 
    { 
     Original = (string)json["short"]["original"], 
     Short = (string)json["short"]["short"], 
     Error = shortErrors 
    }; 
    Assert.IsNotNull(shortie); 
    Assert.AreEqual(2, shortie.Error.Count); 
} 

回答

0

如果你的目標類型(即,這是被反序列化的類型)有一個屬性叫做錯誤是一個列表<>或數組,這仍然可以工作。在這種情況下,我會避免Linq(在我看來)它增加了不必要的串行化不必要的開銷。

JavaScriptDeserializer(example)和Json類都是專門爲此設計的,所以請充分利用這些工具。

如果你真的只是想反序列化對象的一部分,您可以將您JSON源反序列化之前進行一些基本的字符串操作。在您的示例中,搜索「錯誤」之間的所有內容:並匹配關閉']'並將其從JSON字符串中移除。

5

一位同事剛停下來,給我看正是我想要使用LINQ to JSON做...

[TestMethod] 
public void ParseStuffTest() 
{ 
    JObject json = JObject.Parse(shortJson); 
    var shortie = new Shortie 
    { 
     Original = (string)json["short"]["original"], 
     Short = (string)json["short"]["short"], 
     Error = json["short"]["error"].ToList().Select(
      c => new ShortError { Code = (int)c["code"], ErrorMessage = (string)c["msg"] }).ToList() 
    }; 
    Assert.IsNotNull(shortie); 
    Assert.AreEqual(2, shortie.Error.Count); 
} 

沒有什麼不可以。 :-)