85 lines
No EOL
2.6 KiB
C#
85 lines
No EOL
2.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace PlanTempus.Core.Configurations.Common
|
|
{
|
|
|
|
using Newtonsoft.Json.Linq;
|
|
using System.Collections.Generic;
|
|
|
|
public static class KeyValueToJson
|
|
{
|
|
public static JObject Convert(IEnumerable<KeyValuePair<string, JToken>> pairs)
|
|
{
|
|
var root = new JObject();
|
|
|
|
foreach (var pair in pairs)
|
|
{
|
|
var keys = pair.Key.Split(':');
|
|
var current = root;
|
|
|
|
// Gennemgå hierarkiet og opret underobjekter, hvis de ikke eksisterer
|
|
for (int i = 0; i < keys.Length - 1; i++)
|
|
{
|
|
var key = keys[i];
|
|
|
|
if (current[key] == null)
|
|
{
|
|
current[key] = new JObject();
|
|
}
|
|
|
|
current = (JObject)current[key];
|
|
}
|
|
|
|
// Håndter den sidste nøgle og tilføj værdien
|
|
var lastKey = keys[keys.Length - 1];
|
|
var value = ConvertValue(pair.Value);
|
|
|
|
// Hvis den sidste nøgle allerede eksisterer, tilføj til en liste
|
|
if (current[lastKey] != null)
|
|
{
|
|
// Hvis den allerede er en liste, tilføj til listen
|
|
if (current[lastKey].Type == JTokenType.Array)
|
|
{
|
|
((JArray)current[lastKey]).Add(value);
|
|
}
|
|
// Hvis den ikke er en liste, konverter til en liste
|
|
else
|
|
{
|
|
var existingValue = current[lastKey];
|
|
current[lastKey] = new JArray { existingValue, value };
|
|
}
|
|
}
|
|
// Ellers tilføj som en enkelt værdi
|
|
else
|
|
{
|
|
current[lastKey] = value;
|
|
}
|
|
}
|
|
|
|
return root;
|
|
}
|
|
|
|
private static JToken ConvertValue(object value)
|
|
{
|
|
// Hvis værdien allerede er en JToken, returner den direkte
|
|
if (value is JToken token)
|
|
{
|
|
return token;
|
|
}
|
|
|
|
// Konverter andre typer
|
|
return value switch
|
|
{
|
|
int i => new JValue(i),
|
|
double d => new JValue(d),
|
|
bool b => new JValue(b),
|
|
string s => new JValue(s),
|
|
_ => new JValue(value.ToString())
|
|
};
|
|
}
|
|
}
|
|
} |