2015-10-14 4 views
0

Это мой файл JSON.Как читать и итерировать содержимое файла 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» как строку и «исключить» как массив, используя следующий фрагмент.

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

Но я не могу прочитать значение зависимостей. Исключение для исключения: «Ошибка чтения строки. Неожиданный токен: StartObject. Path« dependencies », ...»

Мое требование - читать каждое значение в узле зависимостей и проверять его. Затем добавьте новое значение и запишите его обратно в json fie. Пожалуйста помоги.

Edit: Мой класс продукта:

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 (например, { "имя": "значение"}) в тип ' System.String [] ', потому что для десериализации правильно требуется массив JSON (например, [1,2,3]).

+5

Вы можете показать свой класс «Продукт»? –

+0

Каково поле «зависимостей»? –

+0

создайте класс со свойствами, которые присутствуют в вашей json-строке. – dan

ответ

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); 
} 
+0

, но '' dependencies ": {' означает, что это объект, а не массив/список ... Выберите Json и в VS нажмите Edit -> Paste Special -> Paste Json в качестве классов, чтобы увидеть, что это должно быть. –

+0

In C# он не может быть объектом, потому что он обладает свойствами 'dynamic'. Как вы определяете этот класс? Что произойдет, если в json появится еще одно свойство? Вот почему я не использую массив/список, но «Словарь <строка, строка>' ... –

+0

@Viktor Очень спасибо, его работа. Используя свой код, я могу добавить в файл новые элементы. Что делать, если мне нужно изменить значение существующих элементов? Например, мне нужно изменить версию Microsoft.AspNet.Mvc до 5.0. И еще один случай, как я могу удалить существующий ключ и значение. Пожалуйста, помогите мне. –

2

Чтобы десериализовать файл должным образом, ваши классы должны выглядеть так. Обратите внимание на атрибуты 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.NET как этот

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

В случае, вы просто хотите прочитать некоторые свойства/часть JSON, вы можете использовать Linq-to-Json как это

string content = File.ReadAllText(@"C:\YourDirectory\product.json"); 

JObject jObj = JObject.Parse(content); 
string entityFrameworkSqlServer = (string)jObj["dependencies"]["EntityFramework.SqlServer"];