Regex, чтобы изменить порядок атрибутов в строке JSON? - PullRequest
1 голос
/ 28 июля 2010

Используя API поиска в Facebook, я получил ответ вроде:

"data" : [
    {
        "created_time" : "2010-07-24T19:47:31+0000",
        "description" : "...",
        "icon" : "...",
        "id" : "1",
        "link" : "...",
        "name" : "...",
        "type" : "link",
        "updated_time" : "2010-07-24T19:47:31+0000" 
    },
    {
        "created_time" : "2010-07-24T14:57:51+0000",
        "id" : "2",
        "message" : "...",
        "type" : "status",
        "updated_time" : "2010-07-24T14:57:51+0000" 
    },

Кстати, первая переменная не всегда "created_time".Мне нужно изменить эту позицию атрибута type из-за требования DataContractJsonSerializer для полиморфизма :

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

Результат должен быть:

"data" : [
    {
        "__type" : "link:#Facebook",
        "created_time" : "2010-07-24T19:47:31+0000",
        "description" : "...",
        "icon" : "...",
        "id" : "1",
        "link" : "...",
        "name" : "...",
        "updated_time" : "2010-07-24T19:47:31+0000" 
    },
    {
        "__type" : "status:#Facebook",
        "created_time" : "2010-07-24T14:57:51+0000",
        "id" : "2",
        "message" : "...",
        "updated_time" : "2010-07-24T14:57:51+0000" 
    },

1 Ответ

1 голос
/ 28 июля 2010

Для меня следующие работы:

Поиск

\{(\s+)([^}]*?)"type" : "([^"]*)",\s+

и замена на

{\1"__type" : "\3:#facebook"\1\2

Это ищет открывающую скобку, захватывает все допервая запись type (при совпадении, если блок не содержит единицы), сохраняет его значение и заменяет его в начале содержимого блока.

Вложенные блоки не поддерживаются (не знаю, могут ли они возникнуть).

В C #:

resultString = Regex.Replace(subjectString, @"\{(\s+)([^}]*?)""type"" : ""([^""]*)"",\s+", "{$1\"__type\" : \"$3:#facebook\"$1$2");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...