如何解析非数组JSON

本文关键字:JSON 数组 何解析 | 更新日期: 2023-09-27 18:12:05

我试图从本地。json文件读取json,并使用StreamReaderJson.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,以拉出字段,如ratessn ?

NB -请不要将此问题标记为c#中读取和解析Json文件的副本,因为这是我获得原始代码的地方。

EDIT:正如在其他答案中指出的,jsonArraynull。这解释了我的错误,但仍然没有回答我的问题。我还能如何解析这个json以提取所需的字段?

如何解析非数组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/

编辑:你已经在使用这个