You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
OMS.NET/Common/ActiveData.cs

140 lines
4.6 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System.Text.Json;
using System.Text.Json.Serialization;
namespace OMS.NET.Common
{
public class UserInfo
{
public string? Name { get; set; }
public string? Email { get; set; }
public string? Color { get; set; }
}
public class ActiveDataElement
{
public string EID { get; set; }
public UserInfo? Pick { get; set; }
public UserInfo? Select { get; set; }
public ActiveDataElement(string id)
{
EID = "E" + id;
}
}
public class ActiveDataElementConverter : JsonConverter<ActiveDataElement>
{
public override ActiveDataElement Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType != JsonTokenType.StartObject)
{
throw new JsonException();
}
reader.Read();
string? eid = (reader.GetString()?[1..]) ?? throw new JsonException(); // Removing 'E' prefix to get the ID
var element = new ActiveDataElement(eid);
while (reader.Read())
{
if (reader.TokenType == JsonTokenType.EndObject)
{
break;
}
if (reader.TokenType == JsonTokenType.StartObject)
{
continue;
}
if (reader.TokenType != JsonTokenType.PropertyName)
{
throw new JsonException();
}
string? propertyName = reader.GetString();
reader.Read();
switch (propertyName)
{
case "pick":
element.Pick = DeserializeUserInfo(ref reader);
break;
case "select":
element.Select = DeserializeUserInfo(ref reader);
break;
default:
reader.Skip(); // Skip unknown properties
break;
}
}
//reader.CurrentDepth = 0;
reader.Read();
//还需要读取一次因为之前有过一次读取跳过了一个token最后一个token也要读一次
return element;
}
public override void Write(Utf8JsonWriter writer, ActiveDataElement value, JsonSerializerOptions options)
{
writer.WriteStartObject();
writer.WritePropertyName(value.EID);
writer.WriteStartObject();
if (value.Pick != null) { WriteUserInfo(writer, "pick", value.Pick); }
if (value.Select != null) { WriteUserInfo(writer, "select", value.Select); }
writer.WriteEndObject();
writer.WriteEndObject();
}
private static void WriteUserInfo(Utf8JsonWriter writer, string propertyName, UserInfo userInfo)
{
writer.WriteStartObject(propertyName);
if (userInfo != null)
{
writer.WriteString("name", userInfo.Name);
writer.WriteString("email", userInfo.Email);
writer.WriteString("color", userInfo.Color);
}
writer.WriteEndObject();
}
private static UserInfo DeserializeUserInfo(ref Utf8JsonReader reader)
{
if (reader.TokenType != JsonTokenType.StartObject)
{
throw new JsonException();
}
string? name = null;
string? email = null;
string? color = null;
while (reader.Read())
{
if (reader.TokenType == JsonTokenType.EndObject)
{
break;
}
if (reader.TokenType != JsonTokenType.PropertyName)
{
throw new JsonException();
}
string? propertyName = reader.GetString();
reader.Read();
switch (propertyName)
{
case "name":
name = reader.GetString();
break;
case "email":
email = reader.GetString();
break;
case "color":
color = reader.GetString();
break;
default:
reader.Skip(); // Skip unknown properties
break;
}
}
return new UserInfo { Name = name, Email = email, Color = color };
}
}
}