阅读背景:

GAE数据存储文本会混淆JSON表示

来源:互联网 

The following code excerpt builds a Google App Engine Datastore Entity from a Java Map. Short strings (less than 450 characters) are stored directly, long strings are converted to Text objects.

以下代码摘录从Java Map构建Google App Engine数据存储区实体。短字符串(少于450个字符)直接存储,长字符串转换为Text对象。

for (String key : movieMap.keySet()) {
    String value = movieMap.get(key).trim();
    if (value.length()>0 && value.length()<450) {  // Short String - store as is
        movieEntity.setProperty(key, value);
    } else if (value.length()>=450) {              // Long String - convert to text
        movieEntity.setProperty(key, new Text(value));
    }
}

The following code retrieves the Entity as a Json object:

以下代码将实体检索为Json对象:

Map<String, Object> result = new LinkedHashMap<String, Object>();
result.put("numberOfMovies", String.valueOf(movies.size()));
result.put("movies", movies);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
resp.getWriter().print(gson.toJson(result));

The result JSON for a String description fields:

字符串描述字段的结果JSON:

{

      "propertyMap": {
        "title": "טאנו מתחתנת עם מאנו - Tanu Weds Manu",
        "duration": "154 דקות",
        "movieId": "2315",
        "image_url": "https://www.sderot-cin.org.il/media/sal/movies2009/2315/f18_tano mithatenet iim mano.jpg",
        "description": "סינמסטה - מועדון הסרט ההודי רופא ממוצא הודי חוזר מלונדון במטרה לפגוש את כלתו המיועדת. הוא מופתע לגלות כי היא מאוהבת במישהו אחר ואין בכוונתה להינשא לו. התנהגותה הפראית גורמת לו לשקול מחדש את צעדיו.",
        "explorationDate": "Apr 26, 2013 8:42:36 PM",
        "actors": "קנגנה רנאוט, אר מדווהין",
        "year": "2011",
        "language": "הינדית",
        "director": "אנאנד ראי",
        "country": "הודו"
      }
    },
    {

The result JSON for a Text description fields, with a strange inner dictionary:

文本描述字段的结果JSON,带有奇怪的内部字典:

      "propertyMap": {
        "title": "הנעליים של אדון סימון - הצגת תיאטרון לילדים",
        "movieId": "2316",
        "image_url": "https://www.sderot-cin.org.il/media/sal/movies2009/2316/f18_anaaliim shel adon simon.jpg",
        "description": {
          "value": {
            "value": "תיאטרון אורנה פורת לגילאי 3-7 אדון סימון עוזב את ארצו ועובר לגור בארץ אחרת. בביתו החדש הוא מחליט להיפרד מנעליו הישנות שליוו אותו כל חייו ולהחליפן בנעליים חדשות, אך משום מה הוא לא מצליח להיפטר מהישנות. בכל פעם שהוא זורק אותן, רחוק ככל שיהיה, הן תמיד חוזרות אליו בדרך פלא. הצגה מרגשת ומצחיקה שמלמדת אותנו לקבל בשמחה את הדברים החדשים שבחיינו ובאותו זמן להבין שאפשר גם להתגעגע לדברים הישנים. משך ההצגה כ50 דקות.  כרטיסים: מכירה מוקדמת-30 ₪, ביום ההצגה-40 ₪ מנוי/מלווה : מכירה מוקדמת 20 ₪, ביום ההצגה  30 ₪."
          }
        },
        "explorationDate": "Apr 26, 2013 8:42:36 PM"
      }
    },

The problem is that the description field returns normaly (key:value pair) for String field, but has a strange inner value key for Text fields - compare description in both examples.

问题是描述字段返回String字段的normaly(键:值对),但是Text字段有一个奇怪的内部值键 - 比较两个例子中的描述。

Any idea how can I make Text fields behave normally and appear as the standard

任何想法如何使文本字段行为正常并显示为标准

1 个解决方案

#1


1  

Looks like the inner dictionary is a result of serializing the complex GAE Datastore Text object.

看起来内部字典是序列化复杂GAE数据存储文本对象的结果。

Since you're accessing your fields of your data with keys then I guess annotations and some getter/setter methods isn't possible?

既然您使用密钥访问数据字段,那么我猜注释和一些getter / setter方法是不可能的?

In such case a simple way to fix it may be to iterate through the Map after it is retrieved and set (replace) the Text "description" fields with standard String if they were of type Text.

在这种情况下,修复它的一种简单方法可能是在检索后迭代Map,并使用标准String设置(替换)Text“description”字段(如果它们是Text类型)。

Then when you serialize to JSON those strings will be handled as the other strings.

然后,当您序列化为JSON时,这些字符串将作为其他字符串处理。


分享到: