gpt4 book ai didi

json - ServiceStack.Text.JsonObject.Parse 与 NewtonSoft.Json.Linq.JObject.Parse 的嵌套树 'dynamic' 实例?

转载 作者:行者123 更新时间:2023-12-01 02:30:22 26 4
gpt4 key购买 nike

我想尝试 ServiceStack 的 json 解析,但我已经想出了如何通过 Newtonsoft 做一些我需要的事情。可以通过 ServiceStack 完成同样的事情吗?

我已经尝试使用注释掉的代码,但它给出了异常(exception),有关异常(exception)的详细信息,请参见下文。

谢谢!

乔希

    [Test]
public void TranslateFromGitHubToCommitMessage()
{
const string json =
@"
{
'commits':
[
{
'author': {
'email': 'dev@null.org',
'name': 'The Null Developer'
},
'message': 'okay i give in'
},
{
'author': {
'email': 'author@github.com',
'name': 'Doc U. Mentation'
},
'message': 'Updating the docs, that\'s my job'
},
{
'author': {
'email': 'author@github.com',
'name': 'Doc U. Mentation'
},
'message': 'Oops, typos'
}
]
}
";
dynamic root = JObject.Parse(json);
//dynamic root = ServiceStack.Text.JsonSerializer.DeserializeFromString<JsonObject>(json);
//dynamic root = ServiceStack.Text.JsonObject.Parse(json);

var summaries = new List<string>();

foreach (var commit in root.commits)
{
var author = commit.author;
var message = commit.message;
summaries.Add(string.Format("{0} <{1}>: {2}", author.name, author.email, message));
}

const string expected1 = "The Null Developer <dev@null.org>: okay i give in";
const string expected2 = "Doc U. Mentation <author@github.com>: Updating the docs, that's my job";
const string expected3 = "Doc U. Mentation <author@github.com>: Oops, typos";

Assert.AreEqual(3, summaries.Count);
Assert.AreEqual(expected1, summaries[0]);
Assert.AreEqual(expected2, summaries[1]);
Assert.AreEqual(expected3, summaries[2]);
}

异常(exception)详情

使用第一个注释掉的行时:
dynamic root = ServiceStack.Text.JsonSerializer.DeserializeFromString<JsonObject>(json);

调用该方法时会发生此异常。

空引用异常:
at ServiceStack.Text.Common.DeserializeListWithElements`2.ParseGenericList(String value, Type      createListType, ParseStringDelegate parseFn)
at ServiceStack.Text.Common.DeserializeEnumerable`2.<>c__DisplayClass3.<GetParseFn>b__0(String value)
at ServiceStack.Text.Common.DeserializeSpecializedCollections`2.<>c__DisplayClass7. <GetGenericEnumerableParseFn>b__6(String x)
at ServiceStack.Text.Json.JsonReader`1.Parse(String value)
at ServiceStack.Text.JsonSerializer.DeserializeFromString[T](String value)
at GitHubCommitAttemptTranslator.Tests.GitHubCommitAttemptTranslatorTests.TranslateFromGitHubToCommitMessage()

而且,第二个:
dynamic root = ServiceStack.Text.JsonObject.Parse(json);

var summaries = new List<string>();

foreach (var commit in root.commits) // <-- Happens here

“ServiceStack.Text.JsonObject”不包含“提交”的定义

注:如果我使用第一行中的代码,则消息是“字符串”不包含“提交”的定义,但将类型更改为或改为
at CallSite.Target(Closure , CallSite , Object )
at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
at GitHubCommitAttemptTranslator.Tests.GitHubCommitAttemptTranslatorTests.TranslateFromGitHubToCommitMessage()

从 .NET 4.0 ServiceStack 使用 DynamicJson 后

引用 mythz 的评论:
This test case有效,但如果我像下面这样修改它:
var dog = new { Name = "Spot", Parts = new { Part1 = "black", Part2 = "gray" }, Arr = new [] { "one", "two", "three"} };
var json = DynamicJson.Serialize(dog);
var deserialized = DynamicJson.Deserialize(json);

然后, deserialized.Name 和 Parts 没问题,但 Arr 是字符串类型。

还:

如果我使用 ' 引号,它似乎不起作用。这是正常的吗? json2 工作(在某种程度上 Arr 仍然是一个字符串),但 json3 根本不起作用。它只是返回
Immediate Window:

deserialized = DynamicJson.Deserialize(json3);
{}
base {System.Dynamic.DynamicObject}: {}
_hash: Count = 1

----- code: -----
var json2 =
@"
{
""Name"": ""Spot"",
""Parts"": {
""Part1"": ""black"",
""Part2"": ""gray""
},
""Arr"": [
""one"",
""two"",
""three""
]
}";

var json3 =
@"
{
'Name': 'Spot',
'Parts': {
'Part1': 'black',
'Part2': 'gray'
},
'Arr': [
'one',
'two',
'three'
]
}";

var deserialized = DynamicJson.Deserialize(json1);

最佳答案

ServiceStack 的 JSON Serializer 也支持动态解析,参见 Dynamic JSON section 中如何解析 GitHub 的 JSON 的示例。维基页面的。

关于json - ServiceStack.Text.JsonObject.Parse 与 NewtonSoft.Json.Linq.JObject.Parse 的嵌套树 'dynamic' 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13366387/

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