Java" org.json" vs C#" Newtonsoft.Json.JsonConvert"

时间:2014-04-04 14:21:44

标签: c# json json.net org.json

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

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;
        }

2 个答案:

答案 0 :(得分: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>();

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

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"];

答案 1 :(得分: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");
}