如何读取和迭代JSON文件内容?

时间:2015-10-14 07:34:27

标签: c# json serialization json.net

这是我的JSON文件。

{
  "webroot": "wwwroot",
  "version": "1.0.0-*",

  "dependencies": {
    "EntityFramework.SqlServer": "7.0.0-beta5",
    "EntityFramework.Commands": "7.0.0-beta5",
    "Microsoft.AspNet.Mvc": "6.0.0-beta5",
  },

  "exclude": [
    "wwwroot",
    "node_modules",
    "bower_components"
  ],
}

我可以使用以下代码段将“webroot”的值读作字符串,将“exclude”作为数组读取。

string file = File.ReadAllText("project.json");
Product pro = JsonConvert.DeserializeObject<Product>(file);

但我无法读取依赖关系的价值。抛出异常为“Error reading string。意外的标记:StartObject。路径'依赖',......”

我的要求是读取依赖节点下的每个值并验证它。然后添加一个新值并将其写回json fie。请帮忙。

编辑: 我的产品类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Product
    {
        private string webroot;
        private string[] exclude;
        private string[] dependencies;
        public string WebRoot
        {
            get
            {
                return webroot;
            }
            set
            {
                webroot = value;
            }
        }

        public string[] Exclude
        {
            get
            {
                return exclude;
            }
            set
            {
                exclude = value;
            }
        }

        public string[] Dependencies
        {
            get
            {
                return dependencies;
            }
            set
            {
                dependencies = value;
            }
        }
    }
}

抛出异常:

  

无法反序列化当前的JSON对象(例如{“name”:“value”})   到'System.String []'类型,因为该类型需要一个JSON数组   (例如[1,2,3])正确反序列化。

2 个答案:

答案 0 :(得分:2)

要正确反序列化文件,您的类应如下所示。请注意body的{​​{1}}属性。

JsonProperty

然后您可以使用Json.NET直接反序列化它

using Newtonsoft.Json;

public class Product
{
    public string webroot { get; set; }
    public string version { get; set; }
    public Dependencies dependencies { get; set; }
    public string[] exclude { get; set; }
}

public class Dependencies
{
    [JsonProperty("EntityFramework.SqlServer")]
    public string EntityFrameworkSqlServer { get; set; }
    [JsonProperty("EntityFramework.Commands")]
    public string EntityFrameworkCommands { get; set; }
    [JsonProperty("Microsoft.AspNet.Mvc")]
    public string MicrosoftAspNetMvc { get; set; }
}

如果您只想阅读json的某些属性/部分,可以像这样使用Json.NET

string content = File.ReadAllText(@"C:\YourDirectory\product.json");
var product = JsonConvert.DeserializeObject<Product>(content);

答案 1 :(得分:2)

Dependencies属性是具有动态属性的对象,因此您需要在C#类中使用某种动态对象。

使用Dictionary<string, string> Dependencies属性可以解决问题。这是一个例子:

public class Product
{
    public string Webroot { get; set; }
    public string Version { get; set; }
    public Dictionary<string, string> Dependencies { get; set; }
    public string[] Exclude { get; set; }
}

[ ... ]

static void Main()
{
    string json = File.ReadAllText("project.json");
    Product pro = JsonConvert.DeserializeObject<Product>(json);

    foreach (var dependency in pro.Dependencies)
    {
        // Here you can validate each property instead of printing it ...
        Console.WriteLine("{0}: {1}", dependency.Key, dependency.Value);
    }

    pro.Dependencies.Add("NewProperty", "NewValue");

    var resultJson = JsonConvert.SerializeObject(pro, Formatting.Indented);
    Console.WriteLine(resultJson);
}