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

时间:2015-10-20 19:08:58

标签: c# json json.net

我有一个序列化的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是一种字符串类型。我有什么想法可以迭代这个吗?

4 个答案:

答案 0 :(得分: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 :(得分:1)

由于示例中定义的json字符串表示集合,因此您必须反序列化为List。我创建了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; }

}

答案 2 :(得分:0)

JValue s只能表示字符串和数字等原始值,因此当您将字符串反序列化为JValue时,它会成为string支持的值。

请改为尝试:

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

然后:

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

答案 3 :(得分: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);
    }
}

这对你真的很有帮助。