2016-11-01 4 views
3

входной строки является сочетание какой-то текст с действительным JSON:Извлечение JSON из строки в .NET

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
<TITLE>Title</TITLE> 

<META http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<META HTTP-EQUIV="Content-language" CONTENT="en"> 
<META HTTP-EQUIV="keywords" CONTENT="search words"> 
<META HTTP-EQUIV="Expires" CONTENT="0"> 

<script SRC="include/datepicker.js" LANGUAGE="JavaScript" TYPE="text/javascript"></script> 
<script SRC="include/jsfunctions.js" LANGUAGE="JavaScript" TYPE="text/javascript"></script> 

<link REL="stylesheet" TYPE="text/css" HREF="css/datepicker.css"> 

<script language="javascript" type="text/javascript"> 
function limitText(limitField, limitCount, limitNum) { 
    if (limitField.value.length > limitNum) { 
     limitField.value = limitField.value.substring(0, limitNum); 
    } else { 
     limitCount.value = limitNum - limitField.value.length; 
    } 
} 
</script> 
{"List":[{"ID":"175114","Number":"28992"]} 

Задача состоит в том, чтобы десериализации JSON часть его в какой-то объект. Строка может начинаться с некоторого текста, но, безусловно, содержит действительный JSON. Я попытался использовать JSON validation REGEX, но возникла проблема с синтаксическим анализом такого шаблона в .NET.
Таким образом, в конце концов, я бы хотел получить только:

{ 
    "List": [{ 
     "ID": "175114", 
     "Number": "28992" 
    }] 
} 

Разъяснение 1:
Существует только одного JSON объект в целом грязной строки, но текст может содержать {} (его на самом деле HTML и может содержать JavaScripts с <script> function(){.....)

+0

Ну ... вы можете просто использовать Json.NET –

+0

@ AndyKorneyev Я пытался, но он не может десериализовать строку правильно. Поэтому мне нужно как-то сказать JSON.NET, как ее разобрать. – 0x49D1

+0

Почему текст до и после части JSON существует? Может ли текст содержать '{' и '}'? Если нет, то простым решением было бы найти первый и последний браслеты и предположить, что это начало и конец вашего JSON. В противном случае я бы сказал, что вы ввернуты, потому что вы не сможете сказать, где начинается настоящий JSON. – Theo

ответ

2

Использование регулярных выражений, чтобы найти все возможные JSON структуры:

Regex example

Затем перебирать все эти матчи unitil вы найти матч, который не будет вызывать исключение:

JsonConvert.SerializeObject(match); 

Если вы знаете формат структуры JSON, использование JsonSchema.

+1

Спасибо! С некоторыми усовершенствованиями, которые являются лучшим решением, чем магия с подстроками! – 0x49D1

4

Вы можете использовать этот метод

public object ExtractJsonObject(string mixedString) 
    { 
     for (var i = mixedString.IndexOf('{'); i > -1; i = mixedString.IndexOf('{', i + 1)) 
     { 
      for (var j = mixedString.LastIndexOf('}'); j > -1; j = mixedString.LastIndexOf("}", j -1)) 
      { 
       var jsonProbe = mixedString.Substring(i, j - i + 1); 
       try 
       { 
        return JsonConvert.DeserializeObject(jsonProbe); 
       } 
       catch 
       {       
       } 
      } 
     } 
     return null; 
    } 

Основная идея заключается в поиске всех {и} пар и зондировать их, если они содержат действительный JSON. Первое допустимое событие JSON преобразуется в объект и возвращается.

+0

Я собирался сделать почти такую ​​вещь, найдя вхождения '{' вручную, а затем, чтобы сопоставить некоторые свойства. Принятый ответ кажется мне более правильным. Спасибо за ваше время и помощь тоже! – 0x49D1

+1

@ 0x49D1 - Добро пожаловать. Еще одна мысль: лучше всего исследовать от самого длинного совпадения до кратчайшего (я не уверен, если в матчах регулярных выражений есть определенный порядок). Если нет фиксированного порядка, то подчасти JSON может быть признана также действительным JSON. –