Обратите внимание, что Regexp.quote
в Jon L. 's ответ важен!
if goo =~ /#{Regexp.quote(foo)}/
, Если Вы просто делаете "очевидную" версию:
if goo =~ /#{foo}/
тогда периоды в Вашем тексте соответствия рассматривают, поскольку regexp подстановочные знаки, и "0.0.0.0"
будет соответствовать "0a0b0c0"
.
Примечание также, что, если Вы действительно просто хотите проверить на соответствие подстроки, можно просто сделать
if goo.include?(foo)
, который не требует дополнительного заключения в кавычки или волнения по поводу специальных символов.
[Обновление]
Я только что понял, почему вы не получали результаты обратно ... у вас есть недостающая строка в вашем методе 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;}
Ваш класс данных не соответствует объекту 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);
}
}