我正在尝试从本地.json文件中读取json,并使用StreamReader
和Json.NET
解析内容。杰森&我的代码:
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
等字段?
注意 - 请不要将此问题标记为Read and parse a Json File in C#的副本,因为这是我从中获取原始代码的地方。
编辑:正如其他答案所指出的那样,jsonArray
null 。这解释了我的错误,但仍然没有回答我的问题。我怎样才能解析这个json以提取所需的字段?
答案 0 :(得分:1)
在任何情况下,我都会检查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);
}
}
答案 1 :(得分:1)
我猜这是因为我的json实际上不是数组
是的,返回的对象是动态的,因此请使用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
答案 2 :(得分:1)
一些事情:
如果要手动解析值,则应尝试使用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);
这样你就可以有一个强类型的对象。
答案 3 :(得分:1)
你确定它是一个阵列吗? 如果这是你对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());
答案 4 :(得分:0)
我会启动nuget并获取JSON.net包
https://www.nuget.org/packages/Newtonsoft.Json/
http://james.newtonking.com/json
它有详细记录,可以为您节省大量工作。
编辑:您已经在使用此
答案 5 :(得分:0)
我认为你的问题类似于Deserialize JSON with C#。你可以使用JavaScriptSerializer
答案 6 :(得分:0)
我没有得到一个空引用(使用Json.net 6.0.3)但是你的代码有一个明显的错误:
static void Main(string [] args) { string s =&#34; {&#39; rate&#39;:50,&#39; information&#39;:{&#39; height&#39;:70,&#39; ssn&#39;:43 ,&#39;名称&#39;&#39; andrew&#39;}}&#34; .Replace(&#39; \&#39;&#39;,&#39; \&#34; &#39); var obj = JsonConvert.DeserializeObject(s); dynamic jsonArray = obj; foreach(jsonArray中的var项) { Console.WriteLine(item.rate); Console.WriteLine(item.ssn); } }
错误是Console.WriteLine(item.rate)将抛出。
你的阵列&#39; jsonArray实际上不是一个数组,它是一个字典!
因此,item
=字典中的第一个键值对,= {"rate":50}
。
您可以通过摆脱foreach循环来防止代码抛出。