#c#
#c#
Вопрос:
[
{
"data": {
"user": {
"id": "12345678",
"displayName": "name",
"subscriptionProducts": [
{
"id": "123456",
"emoteSetID": "123456",
"name": "name",
"__typename": "SubscriptionProduct"
},
{
"id": "123456",
"emoteSetID": "123456",
"name": "name2000",
"__typename": "SubscriptionProduct"
},
{
"id": "123456",
"emoteSetID": "123456",
"name": "name_3000",
"__typename": "SubscriptionProduct"
}
],
"self": null,
"__typename": "User"
},
"currentUser": null,
"requestInfo": {
"countryCode": "US",
"__typename": "RequestInfo"
}
},
"extensions": {
"durationMilliseconds": 31,
"operationName": "ChannelPage_SubscribeButton_User",
"requestID": "1234124124asd123412425151245124"
}
}
]
Я получаю этот ответ в своем приложении на C #, и я пытаюсь просто получить «идентификатор», который равен 12345678
после {«data»:{«user»:{«id«: «12345678«… бла-бла-бла
Я написал код, но он не работает
string value = httpreqResp.Split(new[] { "/"id/": /"" }, StringSplitOptions.None)[1].Split('"')[0];
Может ли кто-нибудь помочь, если это возможно
Комментарии:
1. Это JSON, почему бы просто не проанализировать его как JSON?
2. Я уже проанализировал это, мне просто нужно разделить его и просто получить часть 12345678 из всей строки
3. как вы ее проанализировали? у вас просто есть данные в виде
String
. Загрузите ее в POCO или используйте что-то вроде Json. Net’s Linq API (JObject
)4. «Я уже проанализировал это» — нет, вы этого не делали, если спрашиваете о разделении строки. Если бы вы ее проанализировали, у вас уже был бы нужный результат.
5. @Godlike — Это не синтаксический анализ. Вы просто получаете необработанный ответ.
Ответ №1:
- Вы переходите к http://QuickType.io и вставьте свой json в
- Вы устанавливаете некоторые другие параметры, такие как имя корневого класса
- Он генерирует вам кучу C # — я бы сделал это с вашим json, но я нахожусь на мобильном телефоне, и QTIO не работает с ячейкой; не могу вставить json, поэтому мне пришлось использовать пример temperatures.json
- Сгенерированный C # выглядит следующим образом: множество классов, которые представляют объекты в JSON, затем несколько удобных одноразовых методов для преобразования из / в JSON:
// <auto-generated />
//
// To parse this JSON data, add NuGet 'Newtonsoft.Json' then do:
//
// using QuickType;
//
// var temperatures = Temperatures.FromJson(jsonString);
namespace QuickType
{
using System;
using System.Collections.Generic;
using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
public partial class Temperatures
{
[JsonProperty("description")]
public Description Description { get; set; }
[JsonProperty("data")]
public Dictionary<string, Datum> Data { get; set; }
}
public partial class Datum
{
[JsonProperty("value")]
public string Value { get; set; }
[JsonProperty("anomaly")]
public string Anomaly { get; set; }
}
public partial class Description
{
[JsonProperty("title")]
public string Title { get; set; }
[JsonProperty("units")]
public string Units { get; set; }
[JsonProperty("base_period")]
public string BasePeriod { get; set; }
}
public partial class Temperatures
{
public static Temperatures FromJson(string json) => JsonConvert.DeserializeObject<Temperatures>(json, QuickType.Converter.Settings);
}
public static class Serialize
{
public static string ToJson(this Temperatures self) => JsonConvert.SerializeObject(self, QuickType.Converter.Settings);
}
internal static class Converter
{
public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
DateParseHandling = DateParseHandling.None,
Converters =
{
new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
},
};
}
}
- вы получаете строку ответа str с сервера
- вы пишете строку кода типа
var parsed = YourRootClassName.FromJson(str)
- и тогда ваши желаемые данные доступны, например
parsed[0].Data.User.Id
Вы можете сделать аналогичную вещь с помощью функции Visual Studio «Вставить Json как классы», за исключением того, что она не записывает для вас удобные биты десериализатора, как это делает QuickType. Однако эти части не меняются, поэтому, если QTIO когда-либо исчезнет, этот ответ все еще может сохраниться путем смешивания методов deser, описанных выше, с результирующим c # от выполнения вставки в виде классов
Если вы действительно хотите сделать это с помощью string split, просто разделите на "
, и это будет седьмой элемент результирующего массива. Возможно. Он будет чертовски хрупким, вот почему вы должны его разобрать
Редактировать: json2charp можно использовать из ячейки, их версия выглядит следующим образом:
// Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse);
public class SubscriptionProduct {
public string id { get; set; }
public string emoteSetID { get; set; }
public string name { get; set; }
public string __typename { get; set; }
}
public class User {
public string id { get; set; }
public string displayName { get; set; }
public List<SubscriptionProduct> subscriptionProducts { get; set; }
public object self { get; set; }
public string __typename { get; set; }
}
public class RequestInfo {
public string countryCode { get; set; }
public string __typename { get; set; }
}
public class Data {
public User user { get; set; }
public object currentUser { get; set; }
public RequestInfo requestInfo { get; set; }
}
public class Extensions {
public int durationMilliseconds { get; set; }
public string operationName { get; set; }
public string requestID { get; set; }
}
public class MyArray {
public Data data { get; set; }
public Extensions extensions { get; set; }
}
public class Root {
public List<MyArray> MyArray { get; set; }
}
И будет использоваться как:
Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(responseStringFromWebservice);
var id = myDeserializedClass.MyArray[0].Data.User.id;
Ответ №2:
Это строка JSON,
Вы можете использовать JsonSerializer.Десериализуйте, чтобы преобразовать ее в класс C #.
Сначала создайте свои собственные классы для хранения данных, например, так
public class SubscriptionProduct {
public string id { get; set; }
public string emoteSetID { get; set; }
public string name { get; set; }
public string __typename { get; set; }
}
public class User {
public string id { get; set; }
public string displayName { get; set; }
public List<SubscriptionProduct> subscriptionProducts { get; set; }
public object self { get; set; }
public string __typename { get; set; }
}
public class RequestInfo {
public string countryCode { get; set; }
public string __typename { get; set; }
}
public class Data {
public User user { get; set; }
public object currentUser { get; set; }
public RequestInfo requestInfo { get; set; }
}
public class Extensions {
public int durationMilliseconds { get; set; }
public string operationName { get; set; }
public string requestID { get; set; }
}
public class MyArray {
public Data data { get; set; }
public Extensions extensions { get; set; }
}
public class MyClass {
public List<MyArray> MyArray { get; set; }
}
Затем используйте это:
var mydata = JsonSerializer.Deserialize<MyClass>(jsonString);
Комментарии:
1. Пожалуйста, покажите, используя текст OP в формате JSON, как разобрать get значение, которое запрашивает OP.
2. Я хотел бы получить объяснение либо в регулярном выражении, либо в разделенной строке. Класс строк Json и т.д.t.c слишком сложен для понимания, и это слишком неудобно делать каждый раз, если вы можете, пожалуйста, помогите с этим, было бы неплохо. Если нет, это тоже нормально . Спасибо
3. Спасибо, мой код будет работать корректно, но ваше отрицательное голосование намекает другим посетителям, что JSON — неправильный ответ :).
4. Я не голосовал против, но в вопросе было указано, что мне не нравится использовать Json .