2015-10-20 37 views
1

我有一個序列化JSON字符串如何反序列化我的JSON字符串?

string json = " [ 
       { 
        \"id\": 1, 
        \"barcode\": \"TestBARCODE\", 
        \"nsr\": 0, 
        \"stk_in\": 0, 
        \"stk_out\": 0, 
        \"sales\": 0, 
        \"balance\": 1 
       }, 
       { 
        \"id\": 2, 
        \"barcode\": \"TestBARCODE2\", 
        \"nsr\": 0, 
        \"stk_in\": 0, 
        \"stk_out\": 0, 
        \"sales\": 0, 
        \"balance\": 1 
       }, 
       { 
        \"id\": 3, 
        \"barcode\": \"TestBARCODE3\", 
        \"nsr\": 0, 
        \"stk_in\": 0, 
        \"stk_out\": 0, 
        \"sales\": 0, 
        \"balance\": 1 
       }, 
       { 
        \"id\": 4, 
        \"barcode\": \"AAA\", 
        \"nsr\": 0, 
        \"stk_in\": 0, 
        \"stk_out\": 0, 
        \"sales\": 0, 
        \"balance\": 1 
       }, 
       { 
        \"id\": 5, 
        \"barcode\": \"BBB\", 
        \"nsr\": 0, 
        \"stk_in\": 0, 
        \"stk_out\": 0, 
        \"sales\": 0, 
        \"balance\": 1 
       } 
      ]" 

我需要遍歷每一行獲取ID,條形碼,NSR等以及它們的值。我正在使用Newtonsoft,但無法使用它們的示例Movie m = JsonConvert.DeserializeObject<Movie>(json);

我試過var m = JsonConvert.DeserializeObject<JValue>(json);它確實會返回JSON行。對於某些原因,m.Value是一個字符串類型。任何想法我可以迭代這個?

+0

如果只傳入一個對象(而不是整個數組),'DeserializeObject '是否工作? –

+0

@NateBarbettini:如果您想重新格式化JSON,請確保C#代碼仍然有效(使用'@「...」'語法,例如) – StriplingWarrior

+0

@StriplingWarrior感謝您的收穫! –

回答

0

JValue s只能表示像字符串和數字這樣的原始值,所以當您將一個字符串反序列化爲一個JValue時,它會變成一個string-backed值。

試試這個:

var m = JsonConvert.DeserializeObject<JArray>(json); 

然後:

foreach(var item in m) 
{ 
    Console.WriteLine(item["id"]); 
    ... 
} 
+0

我已經嘗試過了,它返回了一個異常無法投射'Newtonsoft.Json.Linq.JValue'類型的對象來鍵入'Newtonsoft。 Json.Linq.JArray'。 –

+0

@JoshuaMasangcay:我覺得很難相信,考慮到我有[一個工作示例](http://share.linqpad.net/brnn2q.linq)。聽起來像你嘗試過*鑄造*結果轉換爲'JArray'而不是告訴'DeserializeObject <>()'你首先需要一個'JArray'。 – StriplingWarrior

1

除了@StriplingWarriors解決辦法:我猜你的Movie聲明不符合JSON字符串。定義類這樣的:

// tip: use a tool like http://json2csharp.com/ to avoid typos etc. 
public class MyObject 
{ 
    public int id {get;set;} 
    public string barcode {get;set;} 
    public int nsr {get;set;} 
    public int stk_in {get;set;} 
    public int stk_out {get;set;} 
    public int sales {get;set;} 
    public int balance {get;set;} 
} 

然後反序列化JSON到您的類的List像這樣:

var m = JsonConvert.DeserializeObject<List<MyObject>>(json); 
1

由於在示例中定義的JSON字符串代表集合,所以你必須反序列化列表。我創建了this dotnet小提琴來演示您的場景。您可以檢查小提琴中的輸出。

using System; 
using Newtonsoft.Json; 
using System.Collections.Generic; 

public class Program 
{ 
    public static void Main() 
    { 
     string json = "[{\"id\":1,\"barcode\":\"TestBARCODE\",\"nsr\":0,\"stk_in\":0,\"stk_out\":0,\"sales\":0,\"balance\":1},{\"id\":2,\"barcode\":\"TestBARCODE2\",\"nsr\":0,\"stk_in\":0,\"stk_out\":0,\"sales\":0,\"balance\":1},{\"id\":3,\"barcode\":\"TestBARCODE3\",\"nsr\":0,\"stk_in\":0,\"stk_out\":0,\"sales\":0,\"balance\":1},{\"id\":4,\"barcode\":\"AAA\",\"nsr\":0,\"stk_in\":0,\"stk_out\":0,\"sales\":0,\"balance\":1},{\"id\":5,\"barcode\":\"BBB\",\"nsr\":0,\"stk_in\":0,\"stk_out\":0,\"sales\":0,\"balance\":1}]"; 
     var movies = JsonConvert.DeserializeObject<List<Movie>>(json); 
     foreach (var movie in movies) 
     { 
      Console.WriteLine("Movie Id : " + movie.Id + " BarCode : " + movie.Barcode); 
     } 
    } 

} 

public class Movie 
{ 
    public int Id {get; set; } 
    public string Barcode {get; set; } 
    public int NSR {get; set; } 


    public int Stk_in {get; set; } 
    public int Stk_out {get; set; } 

    public int Balance {get; set; } 

} 
0

試試這個:

public class Data 
{ 
    public int id { get; set; } 
    public string barcode { get; set; } 
    public int nsr { get; set; } 
    public int stk_in { get; set; } 
    public int stk_out { get; set; } 
    public int sales { get; set; } 
    public int balance { get; set; } 
} 

public class RootObject 
{ 
    public List<Data> data { get; set; } 
} 

RootObject objRootObject = JsonConvert.DeserializeObject<RootObject>(json); 
if (objRootObject.data.Count > 0) 
{ 
    foreach (var item in objRootObject.data) 
    { 
     Console.WriteLine(item.id); 
     Console.WriteLine(item.barcode); 
     Console.WriteLine(item.nsr); 
    } 
} 

這實在是絕對對你有幫助。