从 json 数组读取数据

Reading data from json array

我的 json 格式是 -

{
 "data": {
  "translations": [
   {
    "translatedText": "مرحبا"
   }
  ]
 }
}

我想在不使用 json.net 的情况下阅读翻译后的文本值。 但它总是 returns 空值。

 JavaScriptSerializer ser = new JavaScriptSerializer();
            nameList myNames = ser.Deserialize<nameList>(json);

public class nameList { public name[] Translator { get; set; } }

将 Json 映射到的 class 不正确。


尝试这些 classes 来反序列化 Json,它会工作得很好:

public class Translation
{
    public string translatedText { get; set; }
}

public class Data
{
    public List<Translation> translations { get; set; }
}

public class nameList
{
    public Data data { get; set; }
}

示例 translatedText 属性:

var text = myNames.data.translations[0].translatedText;

根据 nameList class(来自评论),这个 JSON 被转换成,样本 JSON 提供,returned 值为空是因为 Deserialize 方法无法映射到 class.

根据提供的信息,我重新创建了必要的 classes。

class nameList {
    public name[] Translator { get; set; }
}

class name {
    public string TranslatedText { get; set; }
}

然后我尝试使用以下

将提供的 JSON 解析为那些 classes
var serializer = new JavaScriptSerializer();
// The json data, in one line
string json = "{\"data\":{\"translations\":[{\"translatedText\": \"مرحبا\"}]}}";

// Convert back into object similar to described
nameList myNames = serializer.Deserialize<nameList>(json);

try {
    // Attempt to access
    Console.WriteLine(myNames.Translator[0]);
}
catch (Exception ex) {
    Console.WriteLine("Fail:" + ex.Message);
}

执行时,控制台输出以下内容。

Fail: Object reference not set to an instance of an object.

表示 return 值为空。

如前所述,这是由于 Deserialize 方法无法映射到 class。 (虽然很奇怪 InvalidOperationException 没有触发)所以让我们看看 JSON 可以通过转换 nameList.

的实例来映射什么
// Manually created object
nameList myNames = new nameList() {
    Translator = new name[] {
        new name() { TranslatedText = "مرحبا" }
    }
};

// Convert to JSON
string json = serializer.Serialize(myNames);
Console.WriteLine("JSON:\n" + json);

执行时,输出如下。

JSON:
{"Translator":[{"TranslatedText":"?????"}]}

除了 VSCode 调试控制台不支持该语言这一显而易见的事实之外,我们还面临一些非常不同的问题 JSON。

那么让我们来剖析一下...

{ "Translator": [
        {
            "TranslatedText": "مرحبا"
        }
    ]
}
  1. 只有 2 个命名字段,而示例中有 3 个 JSON。
  2. 2 个命名字段与 classes 中的属性匹配,我相信这对于 JavaScriptSerializer class 是强制性的,以便它正确映射值。 (其他库,如 JSON.net 有办法绕过这个限制。)

希望这对您有所帮助。