Преобразование сериализованного объекта php во вложенный json

Я хотел бы изменить формат JSON с:

a:3:{s:10:"modulename";s:6:"assign";s:10:"instanceid";s:1:"3";s:4:"name";s:18:"Assignent_test_two";}

to:

{"modulename":"assign","instanceid":"3","name":"Assignent_test_two"}

Любые мысли о том, как сделать это через C # или Python

Спасибо


person Anbarasan Dhanushkodi    schedule 15.10.2018    source источник
comment
Первая строка недействительна json   -  person Rui Jarimba    schedule 15.10.2018
comment
Сначала не похоже на действительный json. И да у меня разные мысли как конвертировать. Что было у тебя?   -  person Renatas M.    schedule 15.10.2018
comment
stackoverflow.com/help/mcve проверьте и переформатируйте вопрос, чтобы предоставить дополнительные сведения.   -  person Mrinal Kamboj    schedule 15.10.2018
comment
Возможный дубликат Десериализация данных PHP из веб-службы   -  person Drag and Drop    schedule 15.10.2018
comment
Как люди заметили, это не ввод Json. Сначала мы должны найти, что это за формат. Погуглив: size:{ сериализуй, скажи мне, что это сериализация php. С этой информацией найти дубликат довольно просто.   -  person Drag and Drop    schedule 15.10.2018
comment
Привет всем, спасибо за ваш ответ. Это формат журнала с сайта moodle, вы правы, это сериализация php с использованием json_encode(). Мне нужно извлечь данные в этом формате и преобразовать в плоский CSV. мой выбор технологий очень ограничен C#, sql или USQL. Благодарность   -  person Anbarasan Dhanushkodi    schedule 17.10.2018


Ответы (2)


Вводимая строка является результатом PHP Serialize. В следующем формате:
a:size:{key definition;value definition;(repeated per element)}.
Значение массива может быть либо целым числом, либо строкой. Здесь мы будем предполагать, что это всегда строка. Основываясь на этих правилах, мы можем найти значение с помощью :"(\w+)";.

string pattern = @":""(\w+)"";";
string input = @"a:3:{s:10:""modulename"";s:6:""assign"";s:10:""instanceid"";s:1:""3"";s:4:""name"";s:18:""Assignent_test_two"";}";

var originalArray = Regex.Matches(input, pattern)
                         .Cast<Match>()
                         .Select(x => x.Groups[1].Value)
                         .ToArray();
// -> {"modulename", "assign", "instanceid", "3", "name", "Assignent_test_two"}

Мы должны выбрать значение из этого исходного массива данных, 2 на 2, чтобы составить словарь:

var projectionToExpectedResult =
            Enumerable.Range(0, originalArray.Length / 2)
                     .ToDictionary(i => originalArray[i * 2], j => originalArray[j * 2 + 1]);

Сериализация словаря дает ожидаемый результат:

var serilisedResult = JsonConvert.SerializeObject(projectionToExpectedResult);
// -> {"modulename":"assign","instanceid":"3","name":"Assignent_test_two"}

Если бы во входном файле было int данных. Они будут выглядеть как i:1;s:5:"value";. Регулярное выражение будет :"?(\w+)"?;.

person Drag and Drop    schedule 15.10.2018

Вы можете сделать это с помощью string.Split(), потому что это не похоже на json.

ex-

string jsonNew = "{";
string jsonString = "{s:10:\"modulename\";s:6:\"assign\";s:10:\"instanceid\";s:1:\"3\";s:4:\"name\";s:18:\"Assignent_test_two\";}"   // I have Escaped string assuming you are getting the same 
var strArr = jsonString.Split(';');
foreach(var str in strArr){
    var attr = str.Split(':')[2];
    if(jsonNew[jsonNew.Length-1] == ":"){
        jsonNew = jsonNew + attr + ",";
    }
    else if(jsonNew[jsonNew.Length-1] == ","){
        jsonNew = jsonNew + attr + ":";
    }
}
if(jsonNew[jsonNew.Length-1] == ","){
   jsonNew[jsonNew.Length-1] = "}";
}

Я думаю, что что-то подобное можно сделать, чтобы разобрать приведенную выше строку в json. Скажи мне, если идея работает

person Amit chauhan    schedule 15.10.2018