我已经使用自定义 JsonConverter 成功地编写和解析回(递归)我的数据,使用这个:
public override void WriteJson(JsonWriter writer, ManagedSubData value, JsonSerializer serializer)
{
skipOverMe = true;
value.GrabAssetPath();
writer.WriteValue(JsonConvert.SerializeObject(value));
}
问题是,这给了我一个到处都是反斜杠的不可读的 Json。现在,我可以使用它来代替 WriteValue,它会输出一个可读性很好的 Json:
writer.WriteRawValue(JsonConvert.SerializeObject(value));
但是当我尝试读回它时,它失败了。
reader.Value
现在是null
,好像还没调用ReadJson就失败了
public override ManagedSubData ReadJson(JsonReader reader, Type objectType, ManagedSubData existingValue,
bool hasExistingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
{
return null;
}
//fails here
JObject obj = JObject.Parse(reader.Value.ToString());
ManagedSubData asset = ManagedDataHandler.GetSubDataFromGUID(obj["GUID"].ToString());
if (asset == null)
{
asset = ScriptableObject.CreateInstance(objectType) as ManagedSubData;
#if UNITY_EDITOR
if (!Application.isPlaying)
{
AssetDatabase.CreateAsset(asset, obj["assetPath"].ToString());
AssetDatabase.SaveAssets();
}
#endif
}
if (!asset.KeepPlayModeChanges)
{
JsonConvert.PopulateObject(reader.Value.ToString(), asset);
asset.SetDirty();
}
return asset;
}
如果我尝试做
reader.Read
,就会有实际的字段值,只是对象本身的值被认为是null
.
也许我不应该尝试写原始值?我注意到对于每一层嵌套,WriteValue 都会添加额外的斜线,但也许它需要那些来解析它?
有人有什么想法吗?我们有点需要 Json 是可读的,而不是充满垃圾。
我认为主要问题是你并不真正理解 WriteRawValue 和 WriteValue 之间的区别,它们不是一回事,使用 WriteValue 给你一个带转义的字符串而不是一个干净的 json 是有原因的。
看这里: System.Text.Json 中是否有 JRaw 的等价物
只有当你的字符串已经是一个 json 对象时,你才想使用 WriteRawValue,但我认为在你的特定场景中,最好只创建一个 json 数据的对象并实际序列化它。
编辑。基于您可能的 json
的示例YourJsonObject.cs
[Serializable]
public class YourJsonObject {
private float testFloat1;
private string testString;
private ComplexObject subdataTest;
etc...
}
复杂对象.cs
[Serializable]
public class ComplexObject {
private string name;
etc...
}