Встроенный анализатор JSON в .NET framework [duplicate]

The React Native Button очень ограничен в том, что вы можете сделать, см. Кнопка

У нее нет поддержки стиля, и вы не устанавливаете текст «веб-способом», как , но через свойство title

53
задан Eli Revah 31 August 2013 в 09:32
поделиться

6 ответов

Вы можете использовать классы, найденные в System.Json Namespace , которые были добавлены в .NET 4.5. Вам нужно добавить ссылку на сборку System.Runtime.Serialization

Метод JsonValue.Parse () анализирует текст JSON и возвращает JsonValue :

JsonValue value = JsonValue.Parse(@"{ ""name"":""Prince Charming"", ...");

Если вы передадите строку с объектом JSON, вы сможете записать это значение в JsonObject :

using System.Json;


JsonObject result = value as JsonObject;

Console.WriteLine("Name .... {0}", (string)result["name"]);
Console.WriteLine("Artist .. {0}", (string)result["artist"]);
Console.WriteLine("Genre ... {0}", (string)result["genre"]);
Console.WriteLine("Album ... {0}", (string)result["album"]);

Классы очень похожи на классы, найденные в System.Xml.Linq Namespace .

75
ответ дан Andrey Rubshtein 22 August 2018 в 16:31
поделиться
  • 1
    Вам нужно добавить ссылку на сборку System.Runtime.Serialization. – dtb 6 March 2012 в 00:02
  • 2
    Кажется, это в Windows.Data.Json; теперь, как я вижу в своем приложении Metro. – René Stalder 30 June 2012 в 23:42
  • 3
    Используйте Nuget для установки system.json: Install-Package System.Json – GordonB 28 August 2012 в 14:49
  • 4
    Если пакет не найден, убедитесь, что вы добавили номер версии. Пример: PM> Install-Package System.Json -Version 4.0.20126.16343. Найдите текущую версию здесь: nuget.org/packages/System.Json – Adam K Dean 30 March 2013 в 14:12
  • 5
    System.Json все еще находится в стадии бета-тестирования, поэтому пакет Nuget, похоже, является способом его получения. Он не встроен в последнюю полную версию Framework V 4.5.1. Лично мне нравится API Json.Net, который намного реже и быстрее, чем Windows.Data.Json или System.Json. См. james.newtonking.com/json/help/html/… – ShitalShah 15 January 2014 в 00:49

Я выпустил .NET-библиотеку под названием Tiferix.Json, которая позволяет сериализовать и десериализовать Json-файлы в и из объектов ADO.Net DataSet и DataTable. Этот проект является незавершенным и в ближайшие 6 месяцев (надеюсь) я расширю функциональность, чтобы разрешить сериализацию различных типов .Net-классов и объектов, включая динамические классы и анонимные типы. На данный момент библиотека Tiferix.Json не имеет сырой JsonDataReader, но имеет довольно мощный класс JsonDataWriter, который может записывать Json-файлы одним типом типа .NET Binary или StreamWriter. JsonDataWriter библиотеки Tiferix.Json также имеет возможность автоматически идентифицировать ваши файлы Json, что является очень полезной функцией, которую я не видел ни в одной другой библиотеке Json, включая Json.Net.

Если вам интересно, вы можете просмотреть проект Tiferix.Json на моей странице Github и загрузить библиотеки и библиотеки dll. Tiferix.Json предлагает гораздо более легкую альтернативу более широкой библиотеке Json.Net, а также менее жесткую и удобную в использовании (на мой взгляд), чем родные классы .Net Json.

Библиотека Tiferix Json

0
ответ дан Jonathan Tiefer 22 August 2018 в 16:31
поделиться

Я использую это ... но никогда не занимался разработкой приложений для метро, ​​поэтому я не знаю никаких ограничений на доступные вам библиотеки. (обратите внимание, что вам нужно будет пометить ваши классы, как с атрибутами DataContract и DataMember)

public static class JSONSerializer<TType> where TType : class
{
    /// <summary>
    /// Serializes an object to JSON
    /// </summary>
    public static string Serialize(TType instance)
    {
        var serializer = new DataContractJsonSerializer(typeof(TType));
        using (var stream = new MemoryStream())
        {
            serializer.WriteObject(stream, instance);
            return Encoding.Default.GetString(stream.ToArray());
        }
    }

    /// <summary>
    /// DeSerializes an object from JSON
    /// </summary>
    public static TType DeSerialize(string json)
    {
        using (var stream = new MemoryStream(Encoding.Default.GetBytes(json)))
        {
            var serializer = new DataContractJsonSerializer(typeof(TType));
            return serializer.ReadObject(stream) as TType;
        }
    }
}

Итак, если у вас был такой класс ...

[DataContract]
public class MusicInfo
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Artist { get; set; }

    [DataMember]
    public string Genre { get; set; }

    [DataMember]
    public string Album { get; set; }

    [DataMember]
    public string AlbumImage { get; set; }

    [DataMember]
    public string Link { get; set; }

}

Тогда вы будете использовать его так:

var musicInfo = new MusicInfo
{
     Name = "Prince Charming",
     Artist = "Metallica",
     Genre = "Rock and Metal",
     Album = "Reload",
     AlbumImage = "http://up203.siz.co.il/up2/u2zzzw4mjayz.png",
     Link = "http://f2h.co.il/7779182246886"
};

// This will produce a JSON String
var serialized = JSONSerializer<MusicInfo>.Serialize(musicInfo);

// This will produce a copy of the instance you created earlier
var deserialized = JSONSerializer<MusicInfo>.DeSerialize(serialized);
23
ответ дан mklement0 22 August 2018 в 16:31
поделиться
  • 1
    как его использовать? он продолжает спрашивать меня о Типе, что это? – Eli Revah 5 March 2012 в 22:11
  • 2
    Если ваш тип (класс) был вызван MyType, вы бы использовали его следующим образом: JSONSerializer & lt; MyType & gt; .Serialize () и JSONSerializer & lt; MyType & gt; .Deserialize (myInstanceOfMyType) – ctorx 5 March 2012 в 22:12
  • 3
    Похоже, что dtb имеет более новый родной путь (см. Выше), если вы используете v4.5 Framework. – ctorx 5 March 2012 в 22:14
  • 4
    Вы должны использовать Encoding.UTF8.GetString (stream.ToArray ()); если вы хотите поддерживать unicode. – mrexodia 17 August 2017 в 19:10
  • 5
    Это фантастика, спасибо. – Lance McCarthy 10 May 2018 в 17:51

Вы можете использовать DataContractJsonSerializer. Подробнее см. Ссылку .

1
ответ дан TheBoyan 22 August 2018 в 16:31
поделиться
  • 1
    Я пробовал это с помощью этого кода {DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (Song)); Song item = (Песня) ser.ReadObject (новый MemoryStream (Encoding.UTF8.GetBytes (песня))); Debug.WriteLine (item.name); }, и это дает мне ошибку – Eli Revah 5 March 2012 в 23:44
  • 2
    Ошибка типа «Test1.Song» не может быть сериализована. Подумайте о том, чтобы маркировать его атрибутом DataContractAttribute и маркировать все его элементы, которые вы хотите сериализовать с атрибутом DataMemberAttribute. Если тип представляет собой коллекцию, рассмотрите ее маркировку с помощью CollectionDataContractAttribute. См. Документацию Microsoft .NET Framework для других поддерживаемых типов. – Eli Revah 5 March 2012 в 23:44
  • 3
    @EliRevah. Вам необходимо определить контракт данных для десериализации с атрибутом [DataContract] для класса и добавить атрибут [DataMember] для каждого члена. – TheBoyan 5 March 2012 в 23:56

Для тех, у кого нет 4.5, вот моя библиотечная функция, которая читает json. Для этого требуется ссылка на проект System.Web.Extensions.

using System.Web.Script.Serialization;

public object DeserializeJson<T>(string Json)
{
    JavaScriptSerializer JavaScriptSerializer = new JavaScriptSerializer();
    return JavaScriptSerializer.Deserialize<T>(Json);
}

Обычно json выписывается на основе контракта. Этот контракт может и обычно будет кодифицирован в классе (T). Иногда вы можете взять слово из json и искать в браузере объекта, чтобы найти этот тип.

Пример использования:

С учетом json

{"logEntries":[],"value":"My Code","text":"My Text","enabled":true,"checkedIndices":[],"checkedItemsTextOverflows":false}

Вы может анализировать его на объект RadComboBoxClientState следующим образом:

string ClientStateJson = Page.Request.Form("ReportGrid1_cboReportType_ClientState");
RadComboBoxClientState RadComboBoxClientState = DeserializeJson<RadComboBoxClientState>(ClientStateJson);
return RadComboBoxClientState.Value;
4
ответ дан toddmo 22 August 2018 в 16:31
поделиться

Вы пытались использовать JavaScriptSerializer? Также есть DataContractJsonSerializer

5
ответ дан YS. 22 August 2018 в 16:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: