4

RestAPIにscala/liftを使用しています。内部的には、出力としてXml.toJson()を介してjsonに変換されるxmlを生成しています。

今、私は私を狂わせるいくつかの奇妙な行動に気づきました。

たとえば、私は次のxmlを持っています:

<data>
<item>
    <foo>1</foo>
    <bar>1</bar>
</item>
<item>
    <foo>2</foo>
    <bar>2</bar>
</item>
</data>

xml.toJson()の結果は次のようになります。

JObject(
List(
    JField(
        data,JObject(
            List(
                JField(item,
                JArray(
                    List(
                        JObject(
                            List(
                            JField(foo,JString(1)), 
                            JField(bar,JString(1)))
                        ), 
                        JObject(
                            List(
                            JField(foo,JString(2)), 
                            JField(bar,JString(2))
                            )
                        )
                    )
                )
                )
            )
        )
    )
)
)

しかし、新しいxml要素を追加した場合:

<data>
<baz>234</baz>
<item>
    <foo>1</foo>
    <bar>1</bar>
</item>
<item>
    <foo>2</foo>
    <bar>2</bar>
</item>
</data>

JArrayに関しては結果が異なります。

JObject(
List(
    JField(data,JObject(
        List(
            JField(baz,JString(234)), 
            JField(item,JObject(
                List(
                    JField(foo,JString(1)), 
                    JField(bar,JString(1))
                ))
            ), 
            JField(item,JObject(
                List(
                    JField(foo,JString(2)), 
                    JField(bar,JString(2))
                ))
            )
        )
    ))
)

)。

配列が定義されておらず、「item」という名前のオブジェクトが2つあります。これは正常な動作ですか?「item」タグの周りに何かをラップせずに配列を作成したいと思います。

4

1 に答える 1

5

はい、これは意図された動作です:すべての子要素が同じ名前を持つ場合にnet.liftweb.json.Xmlのみ、子要素を にグループ化します。JArray生成された JSON を操作することで、この動作を回避することができます。

JObject(
  (json \ "data").asInstanceOf[JObject].obj.groupBy(_.name).map {
    case (_, v :: Nil) => v
    case (k, vs)       => JField(k, JArray(vs.map(_.value)))
  }.toList
)

しかし、ここには少なくとも 2 つの潜在的な問題があります。

  1. を使用してgroupByいるため、子要素の順序を並べ替えてしまう可能性があります。
  2. が 1 つしかない場合itemは、 にラップされませんJArray

どれだけ気にかけているかにもよりますが、これらの問題を回避する方法を書くこともできますが、ほとんどの場合、それだけの価値はありません。XML と JSON の両方を無視net.liftweb.json.Xmlして、Scala データ構造から生成するだけです。

于 2012-08-19T00:26:42.477 に答える