2015-10-20 3 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 
       } 
      ]" 

Мне нужно перебирать каждую строку, получая Ид, штрих-код, NSR, и т.д., и их значения. Я использую Newtonsoft, но не могу использовать их пример Movie m = JsonConvert.DeserializeObject<Movie>(json);

Я пробовал var m = JsonConvert.DeserializeObject<JValue>(json); Он возвращает строку JSON. Для somereason m.Value является строковым типом. Любые идеи, как я могу повторить это?

+0

Работает ли 'DeserializeObject ', если вы передаете только один объект (а не весь массив)? –

+0

@NateBarbettini: Если вы хотите переформатировать JSON, убедитесь, что код C# по-прежнему действителен (используя синтаксис '@" ... "', например, – StriplingWarrior

+0

@StriplingWarrior благодарит за улов! –

ответ

0

JValue s может представлять только примитивные значения, такие как строки и числа, поэтому, когда вы десериализуете строку в JValue, имеет смысл, что она станет string -перечисленным значением.

Попробуйте вместо этого:

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); 
    } 
} 

Это действительно определенно полезно для вас.