如何解析非数组JSON?

时间:2014-07-09 15:25:15

标签: c# json

我正在尝试从本地.json文件中读取json,并使用StreamReaderJson.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以提取ratessn等字段?

注意 - 请不要将此问题标记为Read and parse a Json File in C#的副本,因为这是我从中获取原始代码的地方。

编辑:正如其他答案所指出的那样,jsonArray null 。这解释了我的错误,但仍然没有回答我的问题。我怎样才能解析这个json以提取所需的字段?

7 个答案:

答案 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

它有详细记录,可以为您节省大量工作。

另见http://json2csharp.com/

编辑:您已经在使用此

答案 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循环来防止代码抛出。