无效 JSON 原语 - 自定义 Serialization/Deserialization
Invalid JSON Primitive - Custom Serialization/Deserialization
我有一个从网络服务返回的 JSON 文件..
facilityName: Ragley DRI01{
"DataCenterManager": {
"first": "",
"second": "Cory Kemp"
},
"RegionalDataCenterManager": {
"first": "",
"second": "John Farrell"
},
"LastUpdatedBy": {
"first": "DCInfoSyncRole",
"second": "v-asalam"
},
"Client": {
"first": "DCInfoSyncRole",
"second": "FacilityMasterPortal"
}
}
facilityName: Quitman, MEI01{
"DataCenterManager": {
"first": "",
"second": "Cory Kemp"
},
"RegionalDataCenterManager": {
"first": "",
"second": "John Farrell"
},
"LastUpdatedBy": {
"first": "DCInfoSyncRole",
"second": "v-asalam"
},
"Client": {
"first": "DCInfoSyncRole",
"second": "FacilityMasterPortal"
}
}
我知道根据 JSONLint 它是无效的,但我必须将此 JSON 对象反序列化为结构化数据表。
我需要自定义 serialization/deserialization 吗?
非常感谢不使用 JSON.net 的任何帮助..
恐怕您面对的可怕格式与真实 JSON 相去甚远,需要调整 JSON 解析器来解析它。您能做的最好的事情就是手动将其转换为有效的 JSON,然后像往常一样继续解析。
当然这会容易出错且脆弱,但如果你真的需要这样做,这是可能的。像这样的事情可以作为开始
var resultBuilder = new StringBuilder();
resultBuilder.Append("[");
var facilityNameRegex = new Regex("facilityName: ((.)+(?={))");
var facilities = facilityNameRegex.Matches(text);
var lastIndex = facilities.Count - 1;
for (int i = 0; i <= lastIndex; i++)
{
var facilityName = facilities[i].Groups[1].Value;
var bodyStartIndex = facilities[i].Index + facilities[i].Length;
var body = (i < lastIndex) ?
text.Substring(bodyStartIndex, facilities[i + 1].Index - bodyStartIndex)
: text.Substring(bodyStartIndex);
resultBuilder.AppendFormat("{{\"facilityName\": {0}, \"settings\": {1}}}",
HttpUtility.JavaScriptStringEncode(facilityName, addDoubleQuotes: true),
body);
if (i != lastIndex)
{
resultBuilder.Append(",");
}
}
resultBuilder.Append("]");
Console.WriteLine(resultBuilder.ToString()); // result is a valid JSON array
我有一个从网络服务返回的 JSON 文件..
facilityName: Ragley DRI01{
"DataCenterManager": {
"first": "",
"second": "Cory Kemp"
},
"RegionalDataCenterManager": {
"first": "",
"second": "John Farrell"
},
"LastUpdatedBy": {
"first": "DCInfoSyncRole",
"second": "v-asalam"
},
"Client": {
"first": "DCInfoSyncRole",
"second": "FacilityMasterPortal"
}
}
facilityName: Quitman, MEI01{
"DataCenterManager": {
"first": "",
"second": "Cory Kemp"
},
"RegionalDataCenterManager": {
"first": "",
"second": "John Farrell"
},
"LastUpdatedBy": {
"first": "DCInfoSyncRole",
"second": "v-asalam"
},
"Client": {
"first": "DCInfoSyncRole",
"second": "FacilityMasterPortal"
}
}
我知道根据 JSONLint 它是无效的,但我必须将此 JSON 对象反序列化为结构化数据表。
我需要自定义 serialization/deserialization 吗?
非常感谢不使用 JSON.net 的任何帮助..
恐怕您面对的可怕格式与真实 JSON 相去甚远,需要调整 JSON 解析器来解析它。您能做的最好的事情就是手动将其转换为有效的 JSON,然后像往常一样继续解析。
当然这会容易出错且脆弱,但如果你真的需要这样做,这是可能的。像这样的事情可以作为开始
var resultBuilder = new StringBuilder();
resultBuilder.Append("[");
var facilityNameRegex = new Regex("facilityName: ((.)+(?={))");
var facilities = facilityNameRegex.Matches(text);
var lastIndex = facilities.Count - 1;
for (int i = 0; i <= lastIndex; i++)
{
var facilityName = facilities[i].Groups[1].Value;
var bodyStartIndex = facilities[i].Index + facilities[i].Length;
var body = (i < lastIndex) ?
text.Substring(bodyStartIndex, facilities[i + 1].Index - bodyStartIndex)
: text.Substring(bodyStartIndex);
resultBuilder.AppendFormat("{{\"facilityName\": {0}, \"settings\": {1}}}",
HttpUtility.JavaScriptStringEncode(facilityName, addDoubleQuotes: true),
body);
if (i != lastIndex)
{
resultBuilder.Append(",");
}
}
resultBuilder.Append("]");
Console.WriteLine(resultBuilder.ToString()); // result is a valid JSON array