将序列化的php对象转换为嵌套的json

时间:2018-10-15 11:41:04

标签: c# json associative-array

我想从以下位置更改JSON格式:

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

收件人:

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

通过C#或Python进行操作的任何想法

谢谢

2 个答案:

答案 0 :(得分:1)

您输入的字符串是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+)"?;

答案 1 :(得分:0)

您可以通过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。告诉我这个想法是否可行