我有一个序列化的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 :(得分: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);
}
}
这对你真的很有帮助。