2

我正在寻找一个将字符串化的 JSON 解析为对象的C# (.NET)库。

对我来说,问题Newtonsoft.Json.JsonConvert在于你总是需要一个具体的类型来进行反序列化:

 SomePredefinedType bla = JsonConvert.DeserializeObject<SomePredefinedType>(stringifiedJson);

因此,我以许多不再使用的课程结束。
类 SomePredefinedType 在该行中使用一次,并且不再使用。

当然导航会更好,你可以像这样调用属性:

string name = bla.Name;
string age = bla.Age;

Java中,我使用了 org.json,其中的反序列化如下所示:

JSONObject jsonObject = new JSONObject(stringifiedJson)

导航要求您知道 JSON 结构是什么。但这始终是事实(否则我怎么能创建SomePredefinedType课程?)

jsonObject.getString("Name");
jsonObject.getString("Age");

问题是:
C# 有 org.json 吗?我不喜欢 Newtonsoft.Json。
我喜欢这种匿名解析的方式。






编辑: 好的,我倾向于在我的帖子中使用简化的示例,因为我不喜欢人们发布一堆代码。我喜欢在基础上说话,这就是我发布简单代码的原因。

这是我无法以简单的方式实现的,就像使用 org.json 一样:

        // Here not using any object, just as answers below stated I could:
        dynamic jsonProviders = JsonConvert.DeserializeObject(stringifiedJson);

        foreach (dynamic jsonProvider in jsonProviders)
        {
            // Fetch provider
            SMSProvider provider = db.SMSProviders.SingleOrDefault(p => p.SMSProviderId == jsonProvider.SMSProviderId);     // What the hell do I use here? thats an error
            CheckIfExists(provider);

            provider.Order = jsonProvider.Order;
        }
4

2 回答 2

7

对我来说,Newtonsoft.Json.JsonConvert 的问题是你总是需要一个具体的类型来进行反序列化:

不必要:

dynamic result = JsonConvert.DeserializeObject("{\"Name\":\"John\",\"Age\":12}");
string name = result.Name;
int age = result.Age;

或者:

var result = JObject.Parse("{\"Name\":\"John\",\"Age\":12}");
string name = result["Name"].Value<string>();
int age = result["Age"].Value<int>();

如果您不想使用第三方库,您可以使用内置的 .NETJavaScriptSerializer类获得类似的结果:

var serializer = new JavaScriptSerializer();
var result = (IDictionary<string, object>)serializer.DeserializeObject("{\"Name\":\"John\", \"Age\":12}");

string name = (string)result["Name"];
int age = (int)result["Age"];
于 2014-04-04T14:26:05.480 回答
2

根据您最近的代码进行更新,我会说您快完成了。你可以简单地这样做:

int id = jsonProvider.SMSProviderId;
SMSProvider provider = db.SMSProviders.SingleOrDefault(p => p.SMSProviderId == id);

捕获id这种方式应该让 EF(或其他任何东西)准确了解如何使用来自 JSON 的值。


Json.NET (JsonConvert) 是一个很棒的库。这里有一些选项可以做你想做的事,而不需要比必要的更多的课程:

// stringifiedJson is {"Name":"George","Age":25}
{
    dynamic deserializedDynamic = JsonConvert.DeserializeObject(stringifiedJson);
    string name = deserializedDynamic.Name;
    int age = deserializedDynamic.Age;
}
{
    var deserializedAnon = JsonConvert.DeserializeAnonymousType(stringifiedJson,
                             new { Name = default(string), Age = default(int) });
    string name = deserializedAnon.Name;
    int age = deserializedAnon.Age;
}
{
    var deserializedDict =
  JsonConvert.DeserializeObject<Dictionary<string, object>>(stringifiedJson);
    string name = (string)deserializedDict["Name"];
    // Age is a long, two casts required
    int age = (int)(long)deserializedDict["Age"];
}
{
    var deserializedDictDyn =
  JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(stringifiedJson);
    string name = deserializedDictDyn["Name"];
    // Age is a long, one cast required with dynamic
    int age = (int)deserializedDictDyn["Age"];
}
{
    var deserializedJObject = JObject.Parse(stringifiedJson);
    string name = (string)deserializedJObject.GetValue("Name");
    int age = (int)deserializedJObject.GetValue("Age");
}
于 2014-04-04T14:30:07.107 回答