У меня есть строка JSON
{
"F1":
{
"BF1":"BV1",
"BF2":"BV2"
},
"F2":"BF1"
}
и я хочу присвоить его объекту этого типа
public class MyType
{
public string F1 {get;set;}
public string F2 {get;set;}
}
другими словами, мне нужно преобразовать JSON в объект, но внутренний объект должен быть назначен как строка JSON
Похоже, вам, вероятно, понадобится специальный конвертер. Мы не можем легко предоставить полезный пример этого, не зная, по крайней мере, какую среду JSON вы используете, например. Newtonsoft.Json или System.Text.Json.
Самый простой способ — десериализовать все это и повторно сериализовать ту часть, которую вы хотите оставить в формате JSON.
самый простой способ
var jObj = JObject.Parse(json);
MyType myType = new MyType
{
F1 = jObj["F1"].ToString(),
F2 = jObj["F2"].ToString()
};
или если вы не хотите форматирования отступа
MyType myType = new MyType
{
F1 = JsonConvert.SerializeObject(jObj["F1"]),
F2 = (string) jObj["F2"];
};
Если вам нравится трудный путь
MyType myType = JsonConvert.DeserializeObject<MyType>(json,new MyTypeJsonConverter());
public class MyTypeJsonConverter : JsonConverter<MyType>
{
public override MyType ReadJson(JsonReader reader, Type objectType, MyType existingValue, bool hasExistingValue, JsonSerializer serializer)
{
var jObj = JObject.Load(reader);
return new MyType
{
F1 = JsonConvert.SerializeObject(jObj["F1"]),
F2 = (string)jObj["F2"]
};
}
// or maybe this
// public override bool CanWrite => false;
public override void WriteJson(JsonWriter writer, MyType value, JsonSerializer serializer)
{
var val = new
{
F1 = JObject.Parse(value.F1),
F2 = value.F2
};
writer.WriteRaw(JsonConvert.SerializeObject(val, Newtonsoft.Json.Formatting.Indented));
}
}
или если у вас есть много свойств, которые должны десериализоваться обычным способом
MyType myType = JsonConvert.DeserializeObject<MyType>(json);
public class MyType
{
[JsonConverter(typeof(MyTypePropertyJsonConverter))]
public string F1 { get; set; }
public string F2 { get; set; }
}
public class MyTypePropertyJsonConverter : JsonConverter<string>
{
public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer)
{
return JsonConvert.SerializeObject(JToken.Load(reader));
}
public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer)
{
writer.WriteRawValue(value);
}
}
Спасибо за ваши усилия, но в классе MyTypePropertyJsonConverter как закодировать метод WriteJson??
@TahaBabi Какой код вы используете?
я использую четвертый
@TahaBabi Я исправил это, попробуй сейчас
Хотя ответ, опубликованный @serge, мне кажется лучше всего. Но я потратил некоторое время, чтобы решить вашу проблему, и в итоге получил следующий код:
dynamic jsonElement = JsonSerializer.Deserialize<dynamic>(json);
MyType myType = new MyType();
myType.F1 = jsonElement.GetProperty("F1").ToString();
myType.F2 = jsonElement.GetProperty("F2").ToString();
Console.WriteLine(myType.F1 + ", " + myType.F2);
Я надеюсь, что это может помочь вам каким-то образом.
Что вы пробовали, что не получилось?