gpt4 book ai didi

c# - 如何使用 JSON.NET "flatten"一些 JSON?

转载 作者:行者123 更新时间:2023-11-30 16:54:33 25 4
gpt4 key购买 nike

我一直遇到这样的情况,我想将一些 JSON 反序列化为与 JSON 结构不完全匹配的类型。例如,如果我有这样的 JSON:

"foo": {
"bar": {
"1": 10,
"4": 20,
"3": 30,
"2": 40,
"5": 50
},
}

那么我需要这样的东西:

class Bar
{
[JsonProperty]
int One;
[JsonProperty]
int Two;
[JsonProperty]
int Three;
[JsonProperty]
int Four;
[JsonProperty]
int Five;
}

class Foo
{
[JsonProperty]
Bar bar;
}

但是如果我想把它变成这样呢?

class Foo
{
int[] values;
}

它在哪里通过从每个键中减去 1 并从中创建一个数组来将键转换为基于 0 的索引?我该怎么做?

我有很多这种自定义反序列化的其他示例,但为了说明起见,我将发布另一个示例,因为我不想要针对这个确切示例量身定制的解决方案,而是我可以提供的解决方案概括。

"foo": {
"bar": [
{
// Bunch of unimportant stuff
},
{
// Something about the structure of this object alerts me to the fact that this is an interesting record.
"baz": 12
},
{
// Bunch of unimportant stuff
}
]
}

我想把它变成:

class Foo
{
int baz;
}

我看过几个 CustomCreationConverters 的例子,比如 this ,但我无法调整那里提供的解决方案以适应上述任何一种情况。

最佳答案

// Something about the structure of this object alerts me to the fact that this is an interesting record.

我不认为 JSON 对象的结构应该说明它的“重要性”。要么客户端不应发送任何不相关的信息,要么您必须在应用程序的某处编写自定义代码以从 JSON 对象中选择相关信息。业务规则应该决定数据的重要性。将 JSON 视为简单数据。

对于您的第一个示例,您可以使用 CustomCreationConverters(如您所述)和 LINQ to JSON 来处理这样的问题:

public class Foo
{
public int[] Values { get; set; }
}

public class FooConverter : CustomCreationConverter<Foo>
{
public override Foo Create(Type objectType)
{
return new Foo();
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{

// Load JObject from stream
JObject jObject = JObject.Load(reader);

// Create target object based on JObject
Foo target = Create(objectType);

// get the properties inside 'bar' as a list of JToken objects
IList<JToken> results = jObject["foo"]["bar"].Children().ToList();

IList<int> values = new List<int>();

// deserialize the tokens into a list of int values
foreach (JToken result in results)
{
int val = JsonConvert.DeserializeObject<int>(result.First.ToString());
values.Add(val);
}

target.Values = values.ToArray();

return target;
}
}

像这样使用它:

string fooText = @"{'foo': {
'bar': {
'1': 10,
'4': 20,
'3': 30,
'2': 40,
'5': 50
},
}
}";


Foo foo = JsonConvert.DeserializeObject<Foo>(fooText, new FooConverter());

您可以在 JSON.NET 文档中了解有关 CustomCreationConverters 以及如何反序列化部分 JSON 片段的更多信息:

http://www.newtonsoft.com/json/help/html/CustomCreationConverter.htm

http://www.newtonsoft.com/json/help/html/SerializingJSONFragments.htm

关于c# - 如何使用 JSON.NET "flatten"一些 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30389990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com