2013-08-30 3 views
22

Я новичок в объектах C# и json, и я пытаюсь переместить мой веб-сайт из файлов конфигурации на основе xml на json based. Есть ли способ загрузить файл .json так, чтобы он превращался в объект? Я искал в Интернете, и я не могу найти его. У меня уже есть xml-файл, преобразованный и сохраненный как .json. Я бы предпочел не использовать стороннюю библиотеку.Загрузка файла .json в программу C#

+0

Возможный дубликат? См. Http://stackoverflow.com/questions/4521239/deserializing-json-using-c-sharp – SolarBear

+6

'Я искал в Интернете, и я не могу найти, что вам трудно поверить ... – I4V

+0

справедливо, я нашел некоторые из этот подобный материал, но я пробовал их решения, и он не работал. Теперь сделаем некоторый прогресс –

ответ

48

Вы действительно должны использовать установленную библиотеку, например Newtonsoft.Json (который использует даже Microsoft для систем, таких как MVC и WebAPI) или .NET встроенный JavascriptSerializer.

Вот пример чтения JSON с помощью Newtonsoft.Json:

JObject o1 = JObject.Parse(File.ReadAllText(@"c:\videogames.json")); 

// read JSON directly from a file 
using (StreamReader file = File.OpenText(@"c:\videogames.json")) 
using (JsonTextReader reader = new JsonTextReader(file)) 
{ 
    JObject o2 = (JObject) JToken.ReadFrom(reader); 
} 
+1

Ну ... obviuosly OP не должен * писать свой собственный *. Но если ему нужен класс framework, который реализует эту функциональность, [JavaScriptSerializer] (http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx) будет работать. –

+0

Я загрузил NewtonSoft, но не хотел, чтобы кто-то кричал на меня за использование внешней библиотеки. –

+0

@inquisitiveIdiot Я неправильно понял и думал, что вы намереваетесь написать свой собственный. Встроенный JavascriptSerializer подходит для большинства случаев использования, но Newtonsoft работает очень быстро и полно. – STW

1

См Microsofts JavaScriptSerializer

Класс JavaScriptSerializer используется внутри асинхронного слоя связи для сериализации и десериализации данных, между браузером и веб-сервером. Вы не можете получить доступ к этому экземпляру сериализатора. Однако этот класс предоставляет публичный API. Следовательно, вы можете использовать класс, если хотите работать с JavaScript. Обозначение объекта (JSON) в управляемом коде.

пространство имен: System.Web.Script.Serialization

Ассамблея: System.Web.Extensions (в System.Web.Extensions.dll)

+0

JSON (вопреки распространенному мнению) * не * подмножество Javascript, см., Например, https://medium.com/joys-of-javascript/json-js-42a28471221d – Nubok

4

Как уже упоминалось в другом ответе Я бы рекомендовал использовать json.NET. Вы можете загрузить пакет с помощью NuGet. Затем, чтобы десериализовать ваши json-файлы на объекты C#, вы можете сделать что-то вроде:

JsonSerializer serializer = new JsonSerializer(); 
    MyObject obj = serializer.Deserialize<MyObject>(File.ReadAllText(@".\path\to\json\config\file.json"); 

Приведенный выше код предполагает, что у вас есть что-то вроде

public class MyObject 
{ 
    public string prop1 { get; set; }; 
    public string prop2 { get; set; }; 
} 

И ваш JSON выглядит;

{ 
     "prop1":"value1", 
     "prop2":"value2" 
} 

Я предпочитаю использовать общий метод десериализации, который будет десериализации JSON в объект при условии, что вы предоставите его с типом Кто это определение соответствует JSon х. Если есть расхождения между ними, они могут бросать или не устанавливать значения или просто игнорировать вещи в json, зависит от проблемы. Если определение json точно соответствует определению типов C#, то оно просто работает.

+0

отсутствует закрывающий) парс на второй строке. – redwards510

8

Еще один хороший способ сериализации JSON в C# ниже:

RootObject ro = new RootObject(); 
    try 
    { 

     StreamReader sr = new StreamReader(FileLoc); 
     string jsonString = sr.ReadToEnd(); 
     JavaScriptSerializer ser = new JavaScriptSerializer(); 
     ro = ser.Deserialize<RootObject>(jsonString); 


    } 

вам нужно добавить ссылку на System.Web.Extensions в .net 4.0 находится в Program Files (x86)> эталонные сборки> framework> system.web.extensions.dll, и вам нужно быть уверенным, что вы используете только обычный 4.0 framework, а не клиент 4.0

+0

не забудьте sr.Close(); – user3704628

1

Использовать сервер.MapPath, чтобы получить фактический путь к файлу JSON и загрузка и прочитать файл с помощью StreamReader

using System; 
using System.Collections.Generic; 
using Newtonsoft.Json; 

public class RootObject 
{ 
    public string url_short { get; set; } 
    public string url_long { get; set; } 
    public int type { get; set; } 
} 

public class Program 
{ 
    static public void Main() 
    { 
     using (StreamReader r = new StreamReader(Server.MapPath("~/test.json"))) 
     { 
      string json = r.ReadToEnd(); 
      List<RootObject> ro = JsonConvert.DeserializeObject<List<RootObject>>(json); 
     } 

    Console.WriteLine(ro[0].url_short);     
    } 
} 

Примечания: Посмотрите ссылку ниже я также ответил на вопрос, подобного this.It будет помогать вам полный How to Parse an example string in C#

+0

импорт System.IO. Ваш код не создается. – thang