using System.Collections; using System.Collections.Generic; using UnityEngine; using o0._9Axis; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using MathNet.Numerics.LinearAlgebra; public class MagJsonConvert { public static MagnetometerAutoCalibrater Parse(string jsonStr) { JObject jo = JObject.Parse(jsonStr); jo.Remove("Complete"); JToken jt_e = jo.GetValue("EllipsoidFitting"); jo.Remove("EllipsoidFitting"); JToken jt_v = jo.GetValue("VectorByBlock"); jo.Remove("VectorByBlock"); int FitCountLeft = jo.GetValue("FitCountLeft").Value(); jo.Remove("FitCountLeft"); MagnetometerAutoCalibrater calibrater = jo.ToObject(); calibrater.FitCountLeft = FitCountLeft; calibrater.EllipsoidFitting = ToEllipsoidFitting(jt_e); foreach (JProperty item in jt_v) { calibrater.VectorByBlock[ToVectorInt(JArray.Parse(item.Name))] = ToVectorDouble(item.Value as JArray); } return calibrater; } public static string ToJson(MagnetometerAutoCalibrater calibrater) { return JsonConvert.SerializeObject(calibrater); } private static EllipsoidFitting ToEllipsoidFitting(JToken jToken) { var Center = ToVectorDouble(jToken["Center"] as JArray); var CorrectMatrix = ToMatrixDouble(jToken["CorrectMatrixArray"] as JArray); var Radius = ToVectorDouble(jToken["Radius"] as JArray); return new EllipsoidFitting(Center, CorrectMatrix, Radius); } private static Matrix ToMatrixDouble(JArray arr) { int rcCount = arr.Count; Matrix matrix = CreateMatrix.Dense(rcCount, rcCount); for (var i = 0; i < rcCount; ++i) for (var j = 0; j < rcCount; ++j) matrix[i, j] = arr[i][j].Value(); return matrix; } private static o0.Geometry.Vector ToVectorDouble(JArray arr) { return new o0.Geometry.Vector( arr[0].Value(), arr[1].Value(), arr[2].Value()); } private static o0.Geometry.Vector ToVectorInt(JArray arr) { return new o0.Geometry.Vector( arr[0].Value(), arr[1].Value(), arr[2].Value()); } }