如何解析非数组JSON
本文关键字:JSON 数组 何解析 | 更新日期: 2023-09-27 18:12:05
我试图从本地。json文件读取json,并使用StreamReader
和Json.NET
解析内容。Json,我的代码:
contents of .json file: {"rate":50,"information":{"height":70,"ssn":43,"name":"andrew"}}
using (var sr = new StreamReader(pathToJsonFile))
{
dynamic jsonArray = JsonConvert.DeserializeObject(sr.ReadToEnd());
foreach(var item in jsonArray)
{
Console.WriteLine(item.rate);
Console.WriteLine(item.ssn);
}
}
这给了我一个错误行foreach(var item in array)
: Object reference not set to an instance of an object.
我猜这是因为我的json实际上不是一个数组,但这就是我如何试图解析它。我怎么能解析这个json,以拉出字段,如rate
或ssn
?
NB -请不要将此问题标记为c#中读取和解析Json文件的副本,因为这是我获得原始代码的地方。
EDIT:正如在其他答案中指出的,jsonArray
是null。这解释了我的错误,但仍然没有回答我的问题。我还能如何解析这个json以提取所需的字段?
几件事:
如果您想手动解析这些值,您应该尝试使用JObject而不是JsonConvert.DeserializeObject。下面的代码应该可以工作:
dynamic jsonObject = JObject.Parse("{'rate':50,'information':{'height':70,'ssn':43,'name':'andrew'}}");
Console.WriteLine(jsonObject["rate"]);
Console.WriteLine(jsonObject["information"]["ssn"]);
然而,如果你知道json的结构,你应该创建一个。net类,如:
public class Person
{
public int rate {get;set;}
public Information information {get;set;}
}
public class Information
{
public int height {get;set;}
public int ssn {get;set;}
public string name {get;set;}
}
,然后使用:
var person = JsonConvert.DeserializeObject<Person>(thestringtodeserialize);
在任何情况下,我都会检查null (DeserializeObject显然可以返回null):
using (var sr = new StreamReader(pathToJsonFile))
{
dynamic jsonArray = JsonConvert.DeserializeObject(sr.ReadToEnd());
if(jsonArray != null) //new check here
{
foreach(var item in jsonArray)
{
Console.WriteLine(item.rate);
Console.WriteLine(item.ssn);
}
}
我猜这是因为我的json实际上不是一个数组
True,返回的对象是动态的,所以使用dynamic:
var json = "{'"rate'":50,'"information'":{'"height'":70,'"ssn'":43,'"name'":'"andrew'"}}";
dynamic obj = JsonConvert.DeserializeObject(json);
Console.WriteLine("rate: {0}. ssn: {1}", obj.rate, obj.information.ssn);
查看实时示例:https://dotnetfiddle.net/nQYuyX
你确定它是一个数组吗?如果这是您期望从Json得到的格式,也许您应该考虑定义一个类。例如:
class SomeJsonObject
{
public int rate {get;set;}
[JsonProperty("information")] //if you want to name your property something else
public InformationObject Information {get;set;}
}
class InformationObject
{
[JsonProperty("height", NullValueHandling = NullValueHandling.Ignore)] //some other things you can do with Json
public int Height {get;set;}
public int ssn {get;set;}
public string name {get;set;}
}
这样你就可以将它反序列化为一个对象:
SomeJsonObject jsonArray = JsonConvert.DeserializeObject<SomeJsonObject>(sr.ReadToEnd());
我认为你的问题类似于用c#反序列化JSON。你可以使用JavaScriptSerializer
我没有得到一个空引用(与Json.net 6.0.3),但你的代码有一个明显的错误:
static void Main(string[] args){字符串s = "{"率":50,"信息":{"高度":70年,"ssn":43岁的"名称":"安德鲁"}}"。取代 ('''', ''"');var obj = JsonConvert.DeserializeObject(s);动态jsonArray = obj;foreach (var item in jsonArray){Console.WriteLine (item.rate);Console.WriteLine (item.ssn);}}
Console.WriteLine(item.rate)会抛出这个bug。你的'array' jsonArray实际上不是一个数组,它是一个字典!因此,item
=字典中的第一个键值对,= {"rate":50}
。您可以通过去掉foreach循环来防止代码抛出。
我将启动nuget并获取JSON.net包
https://www.nuget.org/packages/Newtonsoft.Json/http://james.newtonking.com/json它有很好的文档,可以为您节省大量的工作。
参见http://json2csharp.com/
编辑:你已经在使用这个