Проанализируйте JSON в C#

Обратите внимание, что Regexp.quote в Jon L. 's ответ важен!

if goo =~ /#{Regexp.quote(foo)}/

, Если Вы просто делаете "очевидную" версию:

if goo =~ /#{foo}/

тогда периоды в Вашем тексте соответствия рассматривают, поскольку regexp подстановочные знаки, и "0.0.0.0" будет соответствовать "0a0b0c0".

Примечание также, что, если Вы действительно просто хотите проверить на соответствие подстроки, можно просто сделать

if goo.include?(foo)

, который не требует дополнительного заключения в кавычки или волнения по поводу специальных символов.

198
задан Community 23 May 2017 в 02:25
поделиться

2 ответа

[Обновление]
Я только что понял, почему вы не получали результаты обратно ... у вас есть недостающая строка в вашем методе Deserialize . Вы забыли присвоить результаты своему obj :

public static T Deserialize<T>(string json)
{
    using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
        return (T)serializer.ReadObject(ms);
    } 
}

Кроме того, для справки, вот метод Serialize :

public static string Serialize<T>(T obj)
{
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
    using (MemoryStream ms = new MemoryStream())
    {
        serializer.WriteObject(ms, obj);
        return Encoding.Default.GetString(ms.ToArray());
    }
}

Edit

Если вы хотите использовать Json.NET - это методы сериализации / десериализации, эквивалентные приведенному выше коду ..

Deserialize:

JsonConvert.DeserializeObject<T>(string json);

Serialize:

JsonConvert.SerializeObject(object o);

Это уже часть Json.NET, поэтому вы можете просто вызвать их в классе JsonConvert.

Ссылка: Сериализация и десериализация JSON с помощью Json.NET



Причина, по которой вы получаете StackOverflow, - это ваши свойства .

Возьмем, к примеру, этот:

[DataMember]
public string unescapedUrl
{
    get { return unescapedUrl; } // <= this line is causing a Stack Overflow
    set { this.unescapedUrl = value; }
}

Обратите внимание, что в геттере , вы возвращаете фактическое свойство (т.е. получатель свойства вызывает себя снова и снова), и, таким образом, вы создаете бесконечную рекурсию.


Свойства (в версии 2.0) должны быть определены следующим образом:

string _unescapedUrl; // <= private field

[DataMember]
public string unescapedUrl
{
    get { return _unescapedUrl; } 
    set { _unescapedUrl = value; }
}

У вас есть частный field, а затем вы возвращаете значение этого поля в геттере и устанавливаете значение этого поля в сеттере.


Кстати, если вы используете 3.5 Framework, вы можете просто сделать это и избежать полей поддержки, и пусть компилятор позаботится об этом:

public string unescapedUrl { get; set;}
149
ответ дан 23 November 2019 в 05:13
поделиться

Ваш класс данных не соответствует объекту JSON. Используйте вместо этого:

[DataContract]
public class GoogleSearchResults
{
    [DataMember]
    public ResponseData responseData { get; set; }
}

[DataContract]
public class ResponseData
{
    [DataMember]
    public IEnumerable<Results> results { get; set; }
}

[DataContract]
public class Results
{
    [DataMember]
    public string unescapedUrl { get; set; }

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

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

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

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

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

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

Кроме того, вам не нужно создавать экземпляр класса, чтобы получить его тип для десериализации:

public static T Deserialise<T>(string json)
{
    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
    {
        var serialiser = new DataContractJsonSerializer(typeof(T));
        return (T)serialiser.ReadObject(ms);
    }
}
15
ответ дан 23 November 2019 в 05:13
поделиться
Другие вопросы по тегам:

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