我不确定我是否完全理解了所有的需求,并且映射对我来说也不完全清楚,但是您可以使用类似的库
Newtonsoft.Json
做这样的事。我想这个样本至少能让你走上正轨。
internal class JsonTranslatorOptions
{
public JsonTranslatorOptions(
string kind,
string type,
string version)
{
Kind = kind;
Type = type;
Version = version;
}
public string Kind { get; }
public string Type { get; }
public string Version { get; }
}
internal enum PropertySection
{
None,
Attribute,
Relation
}
internal class JsonTranslator
{
private const string KeyKeyword = "bbl:";
private static readonly string[] ValueKeywords = { KeyKeyword, "pd:" };
private readonly JObject _attributes = new();
private readonly JObject _data = new();
private readonly JObject _payload = new();
private readonly JObject _relations = new();
private readonly JObject _root = new();
public JsonTranslator(JsonTranslatorOptions options)
{
Initialize(options);
}
public JObject Translate(JObject input)
{
TraverseObject(input);
return _root;
}
private void TraverseObject(JObject input)
{
foreach (JProperty property in input.Properties())
{
TraverseProperty(property);
}
}
private void TraverseArray(JArray array)
{
foreach (JToken element in array)
{
if (element is JValue)
{
continue;
}
foreach (JProperty property in ((JObject)element).Properties())
{
TraverseProperty(property);
}
}
}
private void TraverseProperty(JProperty property)
{
switch (property.Value.Type)
{
case JTokenType.Object:
TraverseObject((JObject)property.Value);
break;
case JTokenType.Array:
TraverseArray((JArray)property.Value);
break;
default:
MapPropertyValue(property);
break;
}
}
private void MapPropertyValue(JProperty property)
{
switch (GetPropertySection(property))
{
case PropertySection.Attribute:
_attributes.Add(property);
break;
case PropertySection.Relation:
_relations.Add(property);
break;
}
}
private static PropertySection GetPropertySection(JProperty property)
{
var value = property.Value.Value<string?>();
if (!property.Name.Contains(KeyKeyword))
{
return PropertySection.None;
}
if (value is null || !ValueKeywords.Any(keyword => value.Contains(keyword)))
{
return PropertySection.Attribute;
}
return PropertySection.Relation;
}
private void Initialize(JsonTranslatorOptions options)
{
_root.Add("data", _data);
InitializeData(options);
}
private void InitializeData(JsonTranslatorOptions options)
{
_data.Add("kind", options.Kind);
_data.Add("payload", _payload);
_data.Add("type", options.Type);
_data.Add("version", options.Version);
InitializePayload();
}
private void InitializePayload()
{
_payload.Add("tag-batsman:attributes", _attributes);
_payload.Add("relations", _relations);
}
}
使用它应该是这样的:
var json = JObject.Parse(@"{""BaseObject"":""P | GL"",""bbl: BL | 12 | 11"":""BL | GL | 01"",""BaseObjectDescription"":""PlayerBatsman"",""bbl: B827222"":""downBatsman"",""CreateDate"":""06.01.2022"",""Description"":""PlayerBatsman"",""errors"":[{""ErrorMessage"":""MissingUnit"",""ObjType"":""Property"",""Object"":""test: batsman"",""RefObject"":""bbl: BATS364""}],""bbl: NO87872"":""GHG66762"",""bbl: PONI9912"":""bbl: NOI65661"",""bbl: KOK1022"":""KOK002"",""bbl: 997171SD"":""bbl: YUT12232"",""bbl: 89812"":false,""bbl: 4894"":""pd: 96"",""bbl: KITE212"":""pd: QUTEQ001"",""ProjectCategory"":""Feed"",""bbf: type"":[""[\""bbl:P3924\"",\""boss:Noball\""]""], ""primarybbf:type"":""[\""bbl:P101003924\"",\""boss:Tag\""]""}");
var options = new JsonTranslatorOptions(
kind: "ENTITY",
type: "EQUIPMENT",
version: "data-4-build-606");
var translator = new JsonTranslator(options);
var output = translator.Translate(json);
Console.WriteLine(output.ToString());
它提供的电流输出:
{
"data": {
"kind": "ENTITY",
"payload": {
"tag-batsman:attributes": {
"bbl: 89812": false
},
"relations": {
"bbl: PONI9912": "bbl: NOI65661",
"bbl: 997171SD": "bbl: YUT12232",
"bbl: 4894": "pd: 96",
"bbl: KITE212": "pd: QUTEQ001"
}
},
"type": "EQUIPMENT",
"version": "data-4-build-606"
}
}