如何修复 JsonConverter 的“无法解析原始值”错误?

问题描述 投票:0回答:1

我已经使用自定义 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 是可读的,而不是充满垃圾。

c# unity3d json.net jsonconverter
1个回答
0
投票

我认为主要问题是你并不真正理解 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...
}
© www.soinside.com 2019 - 2024. All rights reserved.