C# 泛型和复杂类型的JsonConverter失败”;JSON中的其他文本……”;

C# 泛型和复杂类型的JsonConverter失败”;JSON中的其他文本……”;,c#,json,jsonconverter,C#,Json,Jsonconverter,我尝试使用json转换器,但没有成功 我有一个可以(反)序列化json的传感器类: internal class JsonSensor<T> : IJsonSensor where T : struct { [JsonProperty(PropertyName = "value")] public T Value { get; set; } [JsonProperty(PropertyName = "state")] public SensorSta

我尝试使用json转换器,但没有成功

我有一个可以(反)序列化json的传感器类:

internal class JsonSensor<T> : IJsonSensor where T : struct
{
    [JsonProperty(PropertyName = "value")]
    public T Value { get; set; }

    [JsonProperty(PropertyName = "state")]
    public SensorState State { get; set; } = SensorState.Unknown;

    public override string ToString()
    {
        return $"Value={Value}; State={State}";
    }
}
问题在于ReadJson方法。在这里,我做了一些错误的事情,导致以下例外情况:

Newtonsoft.Json.JsonSerializationException:完成反序列化对象后,在Json字符串中找到其他文本。路径“”,第1行,位置45

我编写了一个单元测试来隔离这个问题,并尝试了ReadJson方法的不同实现,但我发现,即使“只返回”一个新的
JsonSensor()
反序列化仍然失败

当然,当我删除JsonConverter时,我可以反序列化字符串。这告诉我:

  • 提供的json字符串正常
  • json反序列化的类结构正常
我在ReadJson中做错了什么?如何从读取器中成功读取
JsonSensor
,并转换其值

对于单元测试的完整性:

[TestFixture]
public class GetSensorsTests
{
    [Test]
    public void GetSensors()
    {
        const string test = "{\"IO_PCW_FL_SPR\" : {\"value\":123.0,\"state\":1}}";

        var sensors = JsonConvert.DeserializeObject<Sensors>(test);
        Assert.AreEqual(123.0, sensors.IOPcwFlSpr.Value, 0.00001);
    }
}
[TestFixture]
公共类GetSensorsTests
{
[测试]
公共传感器()
{
常量字符串测试=“{\'IO\U PCW\U FL\U SPR\”:{\'value\':123.0,\'state\':1}}”;
var sensors=JsonConvert.DeserializeObject(测试);
AreEqual(123.0,sensors.IOPcwFlSpr.Value,0.00001);
}
}

这似乎有效,但不确定这是否是预期的工作方式

    public override JsonSensor<double> ReadJson(JsonReader reader, Type objectType, JsonSensor<double> existingValue, bool hasExistingValue,
        JsonSerializer serializer)
    {
        var jsonObject=JObject.Load(reader);
        var s = JsonConvert.DeserializeObject<JsonSensor<double>>(jsonObject.ToString());
        s.Value = s.Value / Factor;
        return s;
    }
public override JsonSensor ReadJson(JsonReader reader,类型objectType,JsonSensor existingValue,bool hasExistingValue,
JsonSerializer(序列化程序)
{
var jsonObject=JObject.Load(读卡器);
var s=JsonConvert.DeserializeObject(jsonObject.ToString());
s、 值=s.值/系数;
返回s;
}
dbc评论后更新:

    public override void WriteJson(JsonWriter writer, JsonSensor<double> value, JsonSerializer serializer)
    {
        value.Value = value.Value * Factor;
        var json = JsonConvert.SerializeObject(value);
        writer.WriteValue(json);
    }

    public override JsonSensor<double> ReadJson(JsonReader reader, Type objectType, JsonSensor<double> existingValue, bool hasExistingValue,
        JsonSerializer serializer)
    {
        var jsonSensor = JObject.Load(reader).ToObject<JsonSensor<double>>();
        jsonSensor.Value = jsonSensor.Value / Factor;
        return jsonSensor;
    }
public override void WriteJson(JsonWriter writer、JsonSensor值、JsonSerializer序列化程序)
{
value.value=value.value*因子;
var json=JsonConvert.SerializeObject(值);
WriteValue(json);
}
公共重写JsonSensor ReadJson(JsonReader reader,类型objectType,JsonSensor existingValue,bool hasExistingValue,
JsonSerializer(序列化程序)
{
var jsonSensor=JObject.Load(reader.ToObject();
jsonSensor.Value=jsonSensor.Value/系数;
返回jsonSensor;
}

是。读卡器位于对象的开头,并且您在自定义转换器中不使用该对象。我想您可以大大简化您的示例(不需要基类转换器,也不需要泛型),并且仍然可以演示相同的问题。
jsonObject.ToObject()
将更有效,因为这样可以避免转换为字符串并重新解析。@dbc这是一个很好的注释,谢谢。对于
WriteJson
,是否也有一些更有趣的事情要做?或者,既然它将被转换为文本,那么它就这么好了吗?@JonSkeet Yeah抱歉,下次将努力去除不相关的部分。我认为您可能在
WriteJson()
中双重序列化字符串。您可能需要使用
WriteRawValue()
而不是
WriteValue()
    public override JsonSensor<double> ReadJson(JsonReader reader, Type objectType, JsonSensor<double> existingValue, bool hasExistingValue,
        JsonSerializer serializer)
    {
        var jsonObject=JObject.Load(reader);
        var s = JsonConvert.DeserializeObject<JsonSensor<double>>(jsonObject.ToString());
        s.Value = s.Value / Factor;
        return s;
    }
    public override void WriteJson(JsonWriter writer, JsonSensor<double> value, JsonSerializer serializer)
    {
        value.Value = value.Value * Factor;
        var json = JsonConvert.SerializeObject(value);
        writer.WriteValue(json);
    }

    public override JsonSensor<double> ReadJson(JsonReader reader, Type objectType, JsonSensor<double> existingValue, bool hasExistingValue,
        JsonSerializer serializer)
    {
        var jsonSensor = JObject.Load(reader).ToObject<JsonSensor<double>>();
        jsonSensor.Value = jsonSensor.Value / Factor;
        return jsonSensor;
    }