设备输出的类JSON非标准格式识别及C#转JSON/对象方法咨询
非标准对象字符串的格式识别与C#处理方案
一、格式类型说明
你拿到的是Java对象的toString()输出格式,这是Java中对象默认或自定义的字符串表示形式,核心特征:
- 用
类名{键=值, 键=值...}结构表示对象 - 嵌套对象遵循同样的
类名{...}格式 - 数组用
[元素1, 元素2...]包裹 - 与JSON的核心区别:键和字符串值无双引号,键值分隔符为
=而非:
二、转换为标准JSON的方法
通过字符串替换将其转为合法JSON,核心步骤:
- 将
类名{替换为{"类名": {,比如Body{→{"Body": { - 将
键=替换为"键":,比如id=0→"id":0 - 将纯大写+下划线的字符串值(如
NOT_TRACKED、UNKNOWN)用双引号包裹 - 确保布尔值(如
true)符合JSON小写规范 - 修正嵌套结构的括号匹配,形成标准JSON结构
示例C#转换函数:
using System.Text.RegularExpressions; public static string ToJson(string rawInput) { string json = rawInput; // 替换类名开头的{为JSON对象格式 json = Regex.Replace(json, @"(\w+)\{", @"{""$1"": {"); // 替换键值分隔符=为:,并给键加引号 json = Regex.Replace(json, @"(\w+)\=", @"""$1"":"); // 给大写标识符类型的字符串值加引号 json = Regex.Replace(json, @"([A-Z_]+)(?=[,\}\]])", @"""$1"""); // 闭合外层对象的括号 json = Regex.Replace(json, @"(\})\]", @"}}$]"); return json; }
三、C#映射为对象的方法
1. 定义对应实体类
根据字符串结构定义C#实体类:
public class Vector2D { public double x { get; set; } public double y { get; set; } } public class Vector3D { public double x { get; set; } public double y { get; set; } public double z { get; set; } } public class Matrix3 { public List<double> values { get; set; } } public class Joint { public string type { get; set; } public string status { get; set; } public Vector2D depthPosition { get; set; } public Vector3D worldPosition { get; set; } public Matrix3 orientation { get; set; } } public class HandPoseInfo { public string leftHand { get; set; } public string rightHand { get; set; } } public class Body { public int id { get; set; } public string status { get; set; } public Vector3D centerOfMass { get; set; } public List<Joint> joints { get; set; } public HandPoseInfo handPoseInfo { get; set; } public bool areJointsEnabled { get; set; } public bool areHandPosesEnabled { get; set; } } // 外层是Body数组的容器类 public class BodyContainer { public Body Body { get; set; } }
2. 反序列化JSON到对象
使用.NET内置System.Text.Json完成反序列化:
using System.Text.Json; // 原始设备输出字符串 string rawStr = "[Body{id=0, status=NOT_TRACKING,...}]"; // 转为标准JSON string jsonStr = ToJson(rawStr); // 反序列化为Body数组 var bodyList = JsonSerializer.Deserialize<List<BodyContainer>>(jsonStr);
3. 直接解析字符串(可选)
若无需转JSON,可通过正则表达式递归解析字符串,手动映射到实体类属性,但实现复杂度较高,仅适合特殊场景。
内容的提问来源于stack exchange,提问作者kbb
相关产品推荐
相关产品推荐

