修改类型的JSON元素“动态”

发布于 2025-02-06 17:05:37 字数 1043 浏览 2 评论 0 原文

我正在尝试对一些JSON数据进行估算,对数据的一小部分进行修改,然后重新序列化为JSON格式。

JSON数据看起来像这样:

{
    "name": "...",
    "type": "...",
    "values": [0, 1, "apple", ...],
    ...
}

value 是一个具有未知数元素的混合型数组,因此我使用 dynamic 用于其C#模型的类型:

public class Model
{
    [JsonPropertyName("name")]
    public String Name { get; set; }
    [JsonPropertyName("type")]
    public String Type { get; set; }
    [JsonPropertyName("values")]
    public dynamic Values { get; set; }
    ...
}

Deserialization该对象很简单:

Value = model.Values[0].GetDouble();

但是,我无法写入它,因为 dynamic 显然仅读取:

model.Values[0] = 1.0;

microsoft.csharp.runtimebinder.runtimebinderexception:'属性或索引器'system.text.json.jsonelement.this [int]'不能分配给 - 仅读取'

我该如何实现这一点?

I am trying to deserialize some JSON data, make a modification to a small part of the data, and re-serialize back into JSON format.

The JSON data looks something like this:

{
    "name": "...",
    "type": "...",
    "values": [0, 1, "apple", ...],
    ...
}

values is a mixed-type array with an unknown number of elements, and as such I use the dynamic type for its C# model:

public class Model
{
    [JsonPropertyName("name")]
    public String Name { get; set; }
    [JsonPropertyName("type")]
    public String Type { get; set; }
    [JsonPropertyName("values")]
    public dynamic Values { get; set; }
    ...
}

Deserializing the object is simple:

Value = model.Values[0].GetDouble();

However, I am unable to write to it because dynamic is apparently read only:

model.Values[0] = 1.0;

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Property or indexer 'System.Text.Json.JsonElement.this[int]' cannot be assigned to -- it is read only'

How can I accomplish this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

鸩远一方 2025-02-13 17:05:37
  1. 应将JSON验证为 jobject
  2. 提取 jobj [“ values] jarray
  3. 更新提取的 jarray value,并分配给 jobj [values']
JObject jObj = JObject.Parse(json);
JArray values = JArray.Parse(jObj["values"].ToString());
values[0] = 1.0;
jObj["values"] = values;

代码


> ; dynamic> 类型或类型。

public class Model
{
    [JsonPropertyName("name")]
    public String Name { get; set; }
    [JsonPropertyName("type")]
    public String Type { get; set; }
    [JsonPropertyName("values")]
    public List<dynamic> Values { get; set; }
    // Or
    // public ArrayList Values { get; set; }
}
Model model = JsonConvert.DeserializeObject<Model>(json);
model.Values[0] = 1.0;

> arraylist

  1. Deserialize the json as JObject.
  2. Extract the jObj["values] as JArray.
  3. Update the extracted JArray value and assign to jObj["values"].
JObject jObj = JObject.Parse(json);
JArray values = JArray.Parse(jObj["values"].ToString());
values[0] = 1.0;
jObj["values"] = values;

Sample .NET Fiddle


Or apply the Values property as List<dynamic> type or ArrayList type.

public class Model
{
    [JsonPropertyName("name")]
    public String Name { get; set; }
    [JsonPropertyName("type")]
    public String Type { get; set; }
    [JsonPropertyName("values")]
    public List<dynamic> Values { get; set; }
    // Or
    // public ArrayList Values { get; set; }
}
Model model = JsonConvert.DeserializeObject<Model>(json);
model.Values[0] = 1.0;

Sample .NET Fiddle

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文